首页 > 解决方案 > 在 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 库

标签: haskellredis

解决方案


推荐阅读