我遵循了在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库