在Haskell中保持Redis连接活跃

时间:2019-12-23 13:42:29

标签: 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库

0 个答案:

没有答案