Allow Redis to store sessions with more than 512k keys.
This commit is contained in:
parent
faae95312a
commit
6895fbee4f
@ -165,6 +165,17 @@ timeFormat = "%Y-%m-%dT%H:%M:%S%Q"
|
|||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
-- | Run the given Redis command in batches of @511*1024@ items.
|
||||||
|
-- This is used for @HMSET@ because there's a hard Redis limit of
|
||||||
|
-- @1024*1024@ arguments to a command. The last result is returned.
|
||||||
|
batched :: Monad m => ([a] -> m b) -> [a] -> m b
|
||||||
|
batched f xs =
|
||||||
|
let (this, rest) = splitAt (511*1024) xs
|
||||||
|
continue | null rest = return
|
||||||
|
| otherwise = const (batched f rest)
|
||||||
|
in f this >>= continue
|
||||||
|
|
||||||
|
|
||||||
-- | Get the session for the given session ID.
|
-- | Get the session for the given session ID.
|
||||||
getSessionImpl :: SessionId -> R.Redis (Maybe Session)
|
getSessionImpl :: SessionId -> R.Redis (Maybe Session)
|
||||||
getSessionImpl sid = parseSession sid <$> unwrap (R.hgetall $ rSessionKey sid)
|
getSessionImpl sid = parseSession sid <$> unwrap (R.hgetall $ rSessionKey sid)
|
||||||
@ -219,7 +230,7 @@ insertSessionImpl session = do
|
|||||||
Nothing -> do
|
Nothing -> do
|
||||||
transaction $ do
|
transaction $ do
|
||||||
let sk = rSessionKey sid
|
let sk = rSessionKey sid
|
||||||
r <- R.hmset sk (printSession session)
|
r <- batched (R.hmset sk) (printSession session)
|
||||||
-- TODO: R.expireat
|
-- TODO: R.expireat
|
||||||
insertSessionForAuthId (sessionKey session) (sessionAuthId session)
|
insertSessionForAuthId (sessionKey session) (sessionAuthId session)
|
||||||
return (() <$ r)
|
return (() <$ r)
|
||||||
@ -238,7 +249,7 @@ replaceSessionImpl session = do
|
|||||||
-- Delete the old session and set the new one.
|
-- Delete the old session and set the new one.
|
||||||
let sk = rSessionKey sid
|
let sk = rSessionKey sid
|
||||||
_ <- R.del [sk]
|
_ <- R.del [sk]
|
||||||
r <- R.hmset sk (printSession session)
|
r <- batched (R.hmset sk) (printSession session)
|
||||||
|
|
||||||
-- Remove the old auth ID from the map if it has changed.
|
-- Remove the old auth ID from the map if it has changed.
|
||||||
let oldAuthId = sessionAuthId oldSession
|
let oldAuthId = sessionAuthId oldSession
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user