haskell - 在 Haskell 中保持 Redis 连接处于活动状态
问题描述
我按照教程在mmhaskell上创建了一个带有 db 和 Redis 缓存的 rest api 。一切正常,直到我使用 Redis 进行缓存,然后每个请求大约需要 1 秒才能完成。
经过一番研究,我发现这可能是因为每次检查缓存时都会重新创建连接。这是通过以下方法完成的。
runRedisAction :: RedisInfo -> Redis a -> IO a
runRedisAction redisInfo action = do
connection <- connect redisInfo
runRedis connection action
每次发出 REST GET 请求时,我都会检查请求的实体是否已经在缓存中,这意味着为每个请求创建连接。检查用户是否已经在缓存中是这样完成的:
fetchUserRedis :: RedisInfo -> Int64 -> IO (Maybe User)
fetchUserRedis redisInfo uid = runRedisAction redisInfo $ do
result <- Redis.get . pack . show $ uid
case result of
Right (Just userString) -> return $ Just (read . unpack $ userString)
_ -> return Nothing
每个 GET 都会调用它。
如何防止每次在 Haskell 中重新建立连接,例如在 Python 中,我可以将连接变量移动到更高的范围。
我考虑的一种方法是在 main 方法中启动它时将连接传递给 REST API,但是如果连接由于某种原因断开连接,我将不得不重新启动所有内容。
希望我设法清楚地说明了问题,如果您需要更多信息,请随时询问:)
PS:我使用 Servant 作为 Rest API,本地安装的 Postgresql DB 和 Hedis 作为我的 Redis 库
解决方案
推荐阅读
- nsis - 如何从 Internet 下载文件并将其路径应用于 MUI_PAGE_LICENSE 宏?
- python - 通过对每个唯一用户进行分组并为每个唯一日期添加访问数列来对数据框进行排序和排名 Python
- python - 在 Django 中使用复选框下载文件?
- r - MatchIt(R 的倾向得分匹配包)引发有关产生的 NA 的错误
- android - 当试图让 ViewBinding 工作时,为什么我的一些布局文件需要以
而其他人没有? - python - 在“诗歌构建”上执行自定义功能
- c# - 如何让我的组合框停止自动更改值
- flutter - Flutter:在 SliverPersistentHeader 的“成形”区域中显示 SliverList
- testing - 如何使用不同的配置进行测试与部署安全帽可靠性?
- jenkins - 如何修复 Jenkins 的 yum 更新