| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Database.Redis
Synopsis
- data Redis a
- runRedis :: Connection -> Redis a -> IO a
- unRedis :: Redis a -> ReaderT RedisEnv IO a
- reRedis :: ReaderT RedisEnv IO a -> Redis a
- class MonadRedis m => RedisCtx (m :: Type -> Type) (f :: Type -> Type) | m -> f where
- returnDecode :: RedisResult a => Reply -> m (f a)
- class Monad m => MonadRedis (m :: Type -> Type) where
- data Connection
- data ConnectError
- connect :: ConnectInfo -> IO Connection
- checkedConnect :: ConnectInfo -> IO Connection
- disconnect :: Connection -> IO ()
- withConnect :: (MonadMask m, MonadIO m) => ConnectInfo -> (Connection -> m c) -> m c
- withCheckedConnect :: ConnectInfo -> (Connection -> IO c) -> IO c
- data ConnectInfo = ConnInfo {}
- defaultConnectInfo :: ConnectInfo
- parseConnectInfo :: String -> Either String ConnectInfo
- connectCluster :: ConnectInfo -> IO Connection
- data PortID
- = PortNumber PortNumber
- | UnixSocket String
- time :: RedisCtx m f => m (f (Integer, Integer))
- data RedisType
- wait :: RedisCtx m f => Integer -> Integer -> m (f Integer)
- data SortOpts = SortOpts {}
- get :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
- data Aggregate
- sort :: RedisCtx m f => ByteString -> SortOpts -> m (f [ByteString])
- migrate :: RedisCtx m f => ByteString -> ByteString -> ByteString -> Integer -> Integer -> m (f Status)
- append :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- bitcount :: RedisCtx m f => ByteString -> m (f Integer)
- keys :: RedisCtx m f => ByteString -> m (f [ByteString])
- select :: RedisCtx m f => Integer -> m (f Status)
- scan :: RedisCtx m f => Cursor -> m (f (Cursor, [ByteString]))
- data XReadResponse = XReadResponse {
- stream :: ByteString
- records :: [StreamsRecord]
- rename :: RedisCtx m f => ByteString -> ByteString -> m (f Status)
- ping :: RedisCtx m f => m (f Status)
- auth :: RedisCtx m f => ByteString -> m (f Status)
- clusterSlots :: RedisCtx m f => m (f ClusterSlotsResponse)
- command :: RedisCtx m f => m (f [CommandInfo])
- data ClusterSlotsResponse = ClusterSlotsResponse {}
- data ClusterSlotsResponseEntry = ClusterSlotsResponseEntry {}
- data ClusterSlotsNode = ClusterSlotsNode {}
- echo :: RedisCtx m f => ByteString -> m (f ByteString)
- quit :: RedisCtx m f => m (f Status)
- del :: RedisCtx m f => [ByteString] -> m (f Integer)
- dump :: RedisCtx m f => ByteString -> m (f ByteString)
- exists :: RedisCtx m f => ByteString -> m (f Bool)
- expire :: RedisCtx m f => ByteString -> Integer -> m (f Bool)
- expireat :: RedisCtx m f => ByteString -> Integer -> m (f Bool)
- data MigrateOpts = MigrateOpts {}
- defaultMigrateOpts :: MigrateOpts
- migrateMultiple :: RedisCtx m f => ByteString -> ByteString -> Integer -> Integer -> MigrateOpts -> [ByteString] -> m (f Status)
- move :: RedisCtx m f => ByteString -> Integer -> m (f Bool)
- objectRefcount :: RedisCtx m f => ByteString -> m (f Integer)
- objectEncoding :: RedisCtx m f => ByteString -> m (f ByteString)
- objectIdletime :: RedisCtx m f => ByteString -> m (f Integer)
- persist :: RedisCtx m f => ByteString -> m (f Bool)
- pexpire :: RedisCtx m f => ByteString -> Integer -> m (f Bool)
- pexpireat :: RedisCtx m f => ByteString -> Integer -> m (f Bool)
- pttl :: RedisCtx m f => ByteString -> m (f Integer)
- randomkey :: RedisCtx m f => m (f (Maybe ByteString))
- renamenx :: RedisCtx m f => ByteString -> ByteString -> m (f Bool)
- restore :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Status)
- restoreReplace :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Status)
- data Cursor
- cursor0 :: Cursor
- data ScanOpts = ScanOpts {}
- defaultScanOpts :: ScanOpts
- scanOpts :: RedisCtx m f => Cursor -> ScanOpts -> m (f (Cursor, [ByteString]))
- defaultSortOpts :: SortOpts
- data SortOrder
- sortStore :: RedisCtx m f => ByteString -> ByteString -> SortOpts -> m (f Integer)
- ttl :: RedisCtx m f => ByteString -> m (f Integer)
- getType :: RedisCtx m f => ByteString -> m (f RedisType)
- hdel :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- hexists :: RedisCtx m f => ByteString -> ByteString -> m (f Bool)
- hget :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe ByteString))
- hgetall :: RedisCtx m f => ByteString -> m (f [(ByteString, ByteString)])
- hincrby :: RedisCtx m f => ByteString -> ByteString -> Integer -> m (f Integer)
- hincrbyfloat :: RedisCtx m f => ByteString -> ByteString -> Double -> m (f Double)
- hkeys :: RedisCtx m f => ByteString -> m (f [ByteString])
- hlen :: RedisCtx m f => ByteString -> m (f Integer)
- hmget :: RedisCtx m f => ByteString -> [ByteString] -> m (f [Maybe ByteString])
- hmset :: RedisCtx m f => ByteString -> [(ByteString, ByteString)] -> m (f Status)
- hscan :: RedisCtx m f => ByteString -> Cursor -> m (f (Cursor, [(ByteString, ByteString)]))
- hscanOpts :: RedisCtx m f => ByteString -> Cursor -> ScanOpts -> m (f (Cursor, [(ByteString, ByteString)]))
- hset :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- hsetnx :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Bool)
- hstrlen :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- hvals :: RedisCtx m f => ByteString -> m (f [ByteString])
- pfadd :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- pfcount :: RedisCtx m f => [ByteString] -> m (f Integer)
- pfmerge :: RedisCtx m f => ByteString -> [ByteString] -> m (f ByteString)
- blpop :: RedisCtx m f => [ByteString] -> Integer -> m (f (Maybe (ByteString, ByteString)))
- brpop :: RedisCtx m f => [ByteString] -> Integer -> m (f (Maybe (ByteString, ByteString)))
- brpoplpush :: RedisCtx m f => ByteString -> ByteString -> Integer -> m (f (Maybe ByteString))
- lindex :: RedisCtx m f => ByteString -> Integer -> m (f (Maybe ByteString))
- linsertBefore :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- linsertAfter :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- llen :: RedisCtx m f => ByteString -> m (f Integer)
- lpop :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
- lpush :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- lpushx :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- lrange :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f [ByteString])
- lrem :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Integer)
- lset :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Status)
- ltrim :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f Status)
- rpop :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
- rpoplpush :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe ByteString))
- rpush :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- rpushx :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- eval :: (RedisCtx m f, RedisResult a) => ByteString -> [ByteString] -> [ByteString] -> m (f a)
- evalsha :: (RedisCtx m f, RedisResult a) => ByteString -> [ByteString] -> [ByteString] -> m (f a)
- data DebugMode
- scriptDebug :: RedisCtx m f => DebugMode -> m (f Bool)
- scriptExists :: RedisCtx m f => [ByteString] -> m (f [Bool])
- scriptFlush :: RedisCtx m f => m (f Status)
- scriptKill :: RedisCtx m f => m (f Status)
- scriptLoad :: RedisCtx m f => ByteString -> m (f ByteString)
- bgrewriteaof :: RedisCtx m f => m (f Status)
- bgsave :: RedisCtx m f => m (f Status)
- clientGetname :: RedisCtx m f => m (f Status)
- clientList :: RedisCtx m f => m (f [ByteString])
- clientPause :: RedisCtx m f => Integer -> m (f Status)
- data ReplyMode
- clientReply :: RedisCtx m f => ReplyMode -> m (f Bool)
- clientSetname :: RedisCtx m f => ByteString -> m (f ByteString)
- commandCount :: RedisCtx m f => m (f Integer)
- commandInfo :: RedisCtx m f => [ByteString] -> m (f [ByteString])
- configGet :: RedisCtx m f => ByteString -> m (f [(ByteString, ByteString)])
- configResetstat :: RedisCtx m f => m (f Status)
- configRewrite :: RedisCtx m f => m (f Status)
- configSet :: RedisCtx m f => ByteString -> ByteString -> m (f Status)
- dbsize :: RedisCtx m f => m (f Integer)
- debugObject :: RedisCtx m f => ByteString -> m (f ByteString)
- flushall :: RedisCtx m f => m (f Status)
- flushdb :: RedisCtx m f => m (f Status)
- info :: RedisCtx m f => m (f ByteString)
- infoSection :: RedisCtx m f => ByteString -> m (f ByteString)
- lastsave :: RedisCtx m f => m (f Integer)
- save :: RedisCtx m f => m (f Status)
- slaveof :: RedisCtx m f => ByteString -> ByteString -> m (f Status)
- data Slowlog = Slowlog {}
- slowlogGet :: RedisCtx m f => Integer -> m (f [Slowlog])
- slowlogLen :: RedisCtx m f => m (f Integer)
- slowlogReset :: RedisCtx m f => m (f Status)
- sadd :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- scard :: RedisCtx m f => ByteString -> m (f Integer)
- sdiff :: RedisCtx m f => [ByteString] -> m (f [ByteString])
- sdiffstore :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- sinter :: RedisCtx m f => [ByteString] -> m (f [ByteString])
- sinterstore :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- sismember :: RedisCtx m f => ByteString -> ByteString -> m (f Bool)
- smembers :: RedisCtx m f => ByteString -> m (f [ByteString])
- smove :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Bool)
- spop :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
- spopN :: RedisCtx m f => ByteString -> Integer -> m (f [ByteString])
- srandmember :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
- srandmemberN :: RedisCtx m f => ByteString -> Integer -> m (f [ByteString])
- srem :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- sscan :: RedisCtx m f => ByteString -> Cursor -> m (f (Cursor, [ByteString]))
- sscanOpts :: RedisCtx m f => ByteString -> Cursor -> ScanOpts -> m (f (Cursor, [ByteString]))
- sunion :: RedisCtx m f => [ByteString] -> m (f [ByteString])
- sunionstore :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- data ZaddOpts = ZaddOpts {}
- defaultZaddOpts :: ZaddOpts
- zadd :: RedisCtx m f => ByteString -> [(Double, ByteString)] -> m (f Integer)
- zaddOpts :: RedisCtx m f => ByteString -> [(Double, ByteString)] -> ZaddOpts -> m (f Integer)
- zcard :: RedisCtx m f => ByteString -> m (f Integer)
- zcount :: RedisCtx m f => ByteString -> Double -> Double -> m (f Integer)
- zincrby :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Double)
- zinterstore :: RedisCtx m f => ByteString -> [ByteString] -> Aggregate -> m (f Integer)
- zinterstoreWeights :: RedisCtx m f => ByteString -> [(ByteString, Double)] -> Aggregate -> m (f Integer)
- zlexcount :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- zrange :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f [ByteString])
- zrangeWithscores :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f [(ByteString, Double)])
- data RangeLex a
- zrangebylex :: RedisCtx m f => ByteString -> RangeLex ByteString -> RangeLex ByteString -> m (f [ByteString])
- zrangebylexLimit :: RedisCtx m f => ByteString -> RangeLex ByteString -> RangeLex ByteString -> Integer -> Integer -> m (f [ByteString])
- zrangebyscore :: RedisCtx m f => ByteString -> Double -> Double -> m (f [ByteString])
- zrangebyscoreWithscores :: RedisCtx m f => ByteString -> Double -> Double -> m (f [(ByteString, Double)])
- zrangebyscoreLimit :: RedisCtx m f => ByteString -> Double -> Double -> Integer -> Integer -> m (f [ByteString])
- zrangebyscoreWithscoresLimit :: RedisCtx m f => ByteString -> Double -> Double -> Integer -> Integer -> m (f [(ByteString, Double)])
- zrank :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe Integer))
- zrem :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- zremrangebylex :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- zremrangebyrank :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f Integer)
- zremrangebyscore :: RedisCtx m f => ByteString -> Double -> Double -> m (f Integer)
- zrevrange :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f [ByteString])
- zrevrangeWithscores :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f [(ByteString, Double)])
- zrevrangebyscore :: RedisCtx m f => ByteString -> Double -> Double -> m (f [ByteString])
- zrevrangebyscoreWithscores :: RedisCtx m f => ByteString -> Double -> Double -> m (f [(ByteString, Double)])
- zrevrangebyscoreLimit :: RedisCtx m f => ByteString -> Double -> Double -> Integer -> Integer -> m (f [ByteString])
- zrevrangebyscoreWithscoresLimit :: RedisCtx m f => ByteString -> Double -> Double -> Integer -> Integer -> m (f [(ByteString, Double)])
- zrevrank :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe Integer))
- zscan :: RedisCtx m f => ByteString -> Cursor -> m (f (Cursor, [(ByteString, Double)]))
- zscanOpts :: RedisCtx m f => ByteString -> Cursor -> ScanOpts -> m (f (Cursor, [(ByteString, Double)]))
- zscore :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe Double))
- zunionstore :: RedisCtx m f => ByteString -> [ByteString] -> Aggregate -> m (f Integer)
- zunionstoreWeights :: RedisCtx m f => ByteString -> [(ByteString, Double)] -> Aggregate -> m (f Integer)
- bitcountRange :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f Integer)
- bitopAnd :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- bitopOr :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- bitopXor :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- bitopNot :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- bitpos :: RedisCtx m f => ByteString -> Integer -> Integer -> Integer -> m (f Integer)
- decr :: RedisCtx m f => ByteString -> m (f Integer)
- decrby :: RedisCtx m f => ByteString -> Integer -> m (f Integer)
- getbit :: RedisCtx m f => ByteString -> Integer -> m (f Integer)
- getrange :: RedisCtx m f => ByteString -> Integer -> Integer -> m (f ByteString)
- getset :: RedisCtx m f => ByteString -> ByteString -> m (f (Maybe ByteString))
- incr :: RedisCtx m f => ByteString -> m (f Integer)
- incrby :: RedisCtx m f => ByteString -> Integer -> m (f Integer)
- incrbyfloat :: RedisCtx m f => ByteString -> Double -> m (f Double)
- mget :: RedisCtx m f => [ByteString] -> m (f [Maybe ByteString])
- mset :: RedisCtx m f => [(ByteString, ByteString)] -> m (f Status)
- msetnx :: RedisCtx m f => [(ByteString, ByteString)] -> m (f Bool)
- psetex :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Status)
- data Condition
- data SetOpts = SetOpts {}
- set :: RedisCtx m f => ByteString -> ByteString -> m (f Status)
- setOpts :: RedisCtx m f => ByteString -> ByteString -> SetOpts -> m (f Status)
- setbit :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Integer)
- setex :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Status)
- setnx :: RedisCtx m f => ByteString -> ByteString -> m (f Bool)
- setrange :: RedisCtx m f => ByteString -> Integer -> ByteString -> m (f Integer)
- strlen :: RedisCtx m f => ByteString -> m (f Integer)
- data XReadOpts = XReadOpts {}
- defaultXreadOpts :: XReadOpts
- data StreamsRecord = StreamsRecord {
- recordId :: ByteString
- keyValues :: [(ByteString, ByteString)]
- data TrimOpts
- xadd :: RedisCtx m f => ByteString -> ByteString -> [(ByteString, ByteString)] -> m (f ByteString)
- xaddOpts :: RedisCtx m f => ByteString -> ByteString -> [(ByteString, ByteString)] -> TrimOpts -> m (f ByteString)
- xread :: RedisCtx m f => [(ByteString, ByteString)] -> m (f (Maybe [XReadResponse]))
- xreadOpts :: RedisCtx m f => [(ByteString, ByteString)] -> XReadOpts -> m (f (Maybe [XReadResponse]))
- xreadGroup :: RedisCtx m f => ByteString -> ByteString -> [(ByteString, ByteString)] -> m (f (Maybe [XReadResponse]))
- xreadGroupOpts :: RedisCtx m f => ByteString -> ByteString -> [(ByteString, ByteString)] -> XReadOpts -> m (f (Maybe [XReadResponse]))
- xack :: RedisCtx m f => ByteString -> ByteString -> [ByteString] -> m (f Integer)
- xgroupCreate :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Status)
- xgroupSetId :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Status)
- xgroupDestroy :: RedisCtx m f => ByteString -> ByteString -> m (f Bool)
- xgroupDelConsumer :: RedisCtx m f => ByteString -> ByteString -> ByteString -> m (f Integer)
- xrange :: RedisCtx m f => ByteString -> ByteString -> ByteString -> Maybe Integer -> m (f [StreamsRecord])
- xrevRange :: RedisCtx m f => ByteString -> ByteString -> ByteString -> Maybe Integer -> m (f [StreamsRecord])
- xlen :: RedisCtx m f => ByteString -> m (f Integer)
- data XPendingSummaryResponse = XPendingSummaryResponse {}
- xpendingSummary :: RedisCtx m f => ByteString -> ByteString -> Maybe ByteString -> m (f XPendingSummaryResponse)
- data XPendingDetailRecord = XPendingDetailRecord {}
- xpendingDetail :: RedisCtx m f => ByteString -> ByteString -> ByteString -> ByteString -> Integer -> Maybe ByteString -> m (f [XPendingDetailRecord])
- data XClaimOpts = XClaimOpts {}
- defaultXClaimOpts :: XClaimOpts
- xclaim :: RedisCtx m f => ByteString -> ByteString -> ByteString -> Integer -> XClaimOpts -> [ByteString] -> m (f [StreamsRecord])
- xclaimJustIds :: RedisCtx m f => ByteString -> ByteString -> ByteString -> Integer -> XClaimOpts -> [ByteString] -> m (f [ByteString])
- data XInfoConsumersResponse = XInfoConsumersResponse {}
- xinfoConsumers :: RedisCtx m f => ByteString -> ByteString -> m (f [XInfoConsumersResponse])
- data XInfoGroupsResponse = XInfoGroupsResponse {}
- xinfoGroups :: RedisCtx m f => ByteString -> m (f [XInfoGroupsResponse])
- data XInfoStreamResponse
- = XInfoStreamResponse { }
- | XInfoStreamEmptyResponse { }
- xinfoStream :: RedisCtx m f => ByteString -> m (f XInfoStreamResponse)
- xdel :: RedisCtx m f => ByteString -> [ByteString] -> m (f Integer)
- xtrim :: RedisCtx m f => ByteString -> TrimOpts -> m (f Integer)
- inf :: RealFloat a => a
- data ClusterNodesResponse = ClusterNodesResponse {}
- data ClusterNodesResponseEntry = ClusterNodesResponseEntry {
- clusterNodesResponseNodeId :: ByteString
- clusterNodesResponseNodeIp :: ByteString
- clusterNodesResponseNodePort :: Integer
- clusterNodesResponseNodeFlags :: [ByteString]
- clusterNodesResponseMasterId :: Maybe ByteString
- clusterNodesResponsePingSent :: Integer
- clusterNodesResponsePongReceived :: Integer
- clusterNodesResponseConfigEpoch :: Integer
- clusterNodesResponseLinkState :: ByteString
- clusterNodesResponseSlots :: [ClusterNodesResponseSlotSpec]
- data ClusterNodesResponseSlotSpec
- clusterNodes :: RedisCtx m f => m (f ClusterNodesResponse)
- clusterSetSlotNode :: RedisCtx m f => Integer -> ByteString -> m (f Status)
- clusterSetSlotStable :: RedisCtx m f => Integer -> m (f Status)
- clusterSetSlotImporting :: RedisCtx m f => Integer -> ByteString -> m (f Status)
- clusterSetSlotMigrating :: RedisCtx m f => Integer -> ByteString -> m (f Status)
- clusterGetKeysInSlot :: RedisCtx m f => Integer -> Integer -> m (f [ByteString])
- watch :: [ByteString] -> Redis (Either Reply Status)
- unwatch :: Redis (Either Reply Status)
- multiExec :: RedisTx (Queued a) -> Redis (TxResult a)
- data Queued a
- data TxResult a
- data RedisTx a
- data Message
- data PubSub
- publish :: RedisCtx m f => ByteString -> ByteString -> m (f Integer)
- pubSub :: PubSub -> (Message -> IO PubSub) -> Redis ()
- subscribe :: [ByteString] -> PubSub
- unsubscribe :: [ByteString] -> PubSub
- psubscribe :: [ByteString] -> PubSub
- punsubscribe :: [ByteString] -> PubSub
- pubSubForever :: Connection -> PubSubController -> IO () -> IO ()
- type RedisChannel = ByteString
- type RedisPChannel = ByteString
- type MessageCallback = ByteString -> IO ()
- type PMessageCallback = RedisChannel -> ByteString -> IO ()
- data PubSubController
- newPubSubController :: MonadIO m => [(RedisChannel, MessageCallback)] -> [(RedisPChannel, PMessageCallback)] -> m PubSubController
- currentChannels :: MonadIO m => PubSubController -> m [RedisChannel]
- currentPChannels :: MonadIO m => PubSubController -> m [RedisPChannel]
- addChannels :: MonadIO m => PubSubController -> [(RedisChannel, MessageCallback)] -> [(RedisPChannel, PMessageCallback)] -> m UnregisterCallbacksAction
- addChannelsAndWait :: MonadIO m => PubSubController -> [(RedisChannel, MessageCallback)] -> [(RedisPChannel, PMessageCallback)] -> m UnregisterCallbacksAction
- removeChannels :: MonadIO m => PubSubController -> [RedisChannel] -> [RedisPChannel] -> m ()
- removeChannelsAndWait :: MonadIO m => PubSubController -> [RedisChannel] -> [RedisPChannel] -> m ()
- type UnregisterCallbacksAction = IO ()
- sendRequest :: (RedisCtx m f, RedisResult a) => [ByteString] -> m (f a)
- data Reply
- = SingleLine ByteString
- | Error ByteString
- | Integer Integer
- | Bulk (Maybe ByteString)
- | MultiBulk (Maybe [Reply])
- data Status
- = Ok
- | Pong
- | Status ByteString
- class RedisResult a where
- data ConnectionLostException = ConnectionLost
- newtype ConnectTimeout = ConnectTimeout ConnectPhase
- data HashSlot
- keyToSlot :: ByteString -> HashSlot
How To Use This Module
Connect to a Redis server:
-- connects to localhost:6379 conn <-checkedConnectdefaultConnectInfo
Connect to a Redis server using TLS:
-- connects to foobar.redis.cache.windows.net:6380
import Network.TLS
import Network.TLS.Extra.Cipher
import Data.X509.CertificateStore
import Data.Default.Class (def)
(Just certStore) <- readCertificateStore "azure-redis.crt"
let tlsParams = (defaultParamsClient "foobar.redis.cache.windows.net" "") { clientSupported = def { supportedCiphers = ciphersuite_strong }, clientShared = def { sharedCAStore = certStore } }
let redisConnInfo = defaultConnectInfo { connectHost = "foobar.redis.cache.windows.net", connectPort = PortNumber 6380, connectTLSParams = Just tlsParams, connectAuth = Just "Foobar!" }
conn <- checkedConnect redisConnInfo
Send commands to the server:
{-# LANGUAGE OverloadedStrings #-}
...
runRedis conn $ do
set "hello" "hello"
set "world" "world"
hello <- get "hello"
world <- get "world"
liftIO $ print (hello,world)
disconnect all idle resources in the connection pool:
disconnectconn
Command Type Signatures
Redis commands behave differently when issued in- or outside of a transaction. To make them work in both contexts, most command functions have a type signature similar to the following:
echo:: (RedisCtxm f) => ByteString -> m (f ByteString)
Here is how to interpret this type signature:
- The argument types are independent of the execution context.
echoalways takes aByteStringparameter, whether in- or outside of a transaction. This is true for all command functions. - All Redis commands return their result wrapped in some "container".
The type
fof this container depends on the commands execution contextm. TheByteStringreturn type in the example is specific to theechocommand. For other commands, it will often be another type. - In the "normal" context
Redis, outside of any transactions, results are wrapped in an.EitherReply - Inside a transaction, in the
RedisTxcontext, results are wrapped in aQueued.
In short, you can view any command with a RedisCtx constraint in the
type signature, to "have two types". For example echo "has both
types":
echo :: ByteString -> Redis (Either Reply ByteString) echo :: ByteString -> RedisTx (Queued ByteString)
Lua Scripting
Lua values returned from the eval and evalsha functions will be
converted to Haskell values by the decode function from the
RedisResult type class.
Lua Type | Haskell Type | Conversion Example
--------------|--------------------|-----------------------------
Number | Integer | 1.23 => 1
String | ByteString, Double | "1.23" => "1.23" or 1.23
Boolean | Bool | false => False
Table | List | {1,2} => [1,2]
Additionally, any of the Haskell types from the table above can be
wrapped in a Maybe:
42 => Just 42 :: Maybe Integer nil => Nothing :: Maybe Integer
Note that Redis imposes some limitations on the possible conversions:
- Lua numbers can only be converted to Integers. Only Lua strings can be interpreted as Doubles.
- Associative Lua tables can not be converted at all. Returned tables must be "arrays", i.e. indexed only by integers.
The Redis Scripting website (http://redis.io/commands/eval) documents the exact semantics of the scripting commands and value conversion.
Automatic Pipelining
Commands are automatically pipelined as much as possible. For example, in the above "hello world" example, all four commands are pipelined. Automatic pipelining makes use of Haskell's laziness. As long as a previous reply is not evaluated, subsequent commands can be pipelined.
Automatic pipelining is limited to the scope of runRedis call and
it is guaranteed that every reply expected as a part of runRedis
execution gets received after runRedis invocation.
To keep memory usage low, the number of requests "in the pipeline" is limited (per connection) to 1000. After that number, the next command is sent only when at least one reply has been received. That means, command functions may block until there are less than 1000 outstanding replies.
Error Behavior
- Operations against keys holding the wrong kind of value:
- Outside of a
transaction, if the Redis server returns an
Error, command functions will returnLefttheReply. The library user can inspect the error message to gain information on what kind of error occured. - Connection to the server lost:
- In case of a lost connection, command
functions throw a
ConnectionLostException. It can only be caught outside ofrunRedis. - Trying to connect to an unreachable server:
- When trying to connect to
a server that does not exist or can't be reached, the connection pool
only starts the first connection when actually executing a call to
the server. This can lead to discovering very late that the server is
not available, for example when running a server that logs to Redis.
To prevent this, run a
pingcommand directly after connecting or use thecheckedConnectfunction which encapsulates this behavior. - Exceptions:
- Any exceptions can only be caught outside of
runRedis. This way the connection pool can properly close the connection, making sure it is not left in an unusable state, e.g. closed or inside a transaction.
The Redis Monad
Context for normal command execution, outside of transactions. Use
runRedis to run actions of this type.
In this context, each result is wrapped in an Either to account for the
possibility of Redis returning an Error reply.
Instances
| MonadIO Redis Source # | |
| Applicative Redis Source # | |
| Functor Redis Source # | |
| Monad Redis Source # | |
| MonadFail Redis Source # | |
| MonadRedis Redis Source # | |
| MonadUnliftIO Redis Source # | |
Defined in Database.Redis.Core.Internal Methods withRunInIO :: ((forall a. Redis a -> IO a) -> IO b) -> Redis b | |
| RedisCtx Redis (Either Reply) Source # | |
Defined in Database.Redis.Core Methods returnDecode :: RedisResult a => Reply -> Redis (Either Reply a) Source # | |
runRedis :: Connection -> Redis a -> IO a Source #
Interact with a Redis datastore specified by the given Connection.
Each call of runRedis takes a network connection from the Connection
pool and runs the given Redis action. Calls to runRedis may thus block
while all connections from the pool are in use.
class MonadRedis m => RedisCtx (m :: Type -> Type) (f :: Type -> Type) | m -> f where Source #
This class captures the following behaviour: In a context m, a command
will return its result wrapped in a "container" of type f.
Please refer to the Command Type Signatures section of this page for more information.
Methods
returnDecode :: RedisResult a => Reply -> m (f a) Source #
Instances
| RedisCtx RedisTx Queued Source # | |
Defined in Database.Redis.Transactions Methods returnDecode :: RedisResult a => Reply -> RedisTx (Queued a) Source # | |
| RedisCtx Redis (Either Reply) Source # | |
Defined in Database.Redis.Core Methods returnDecode :: RedisResult a => Reply -> Redis (Either Reply a) Source # | |
class Monad m => MonadRedis (m :: Type -> Type) where Source #
Instances
Connection
data Connection Source #
A threadsafe pool of network connections to a Redis server. Use the
connect function to create one.
data ConnectError Source #
Constructors
| ConnectAuthError Reply | |
| ConnectSelectError Reply |
Instances
| Exception ConnectError Source # | |
Defined in Database.Redis.Connection Methods toException :: ConnectError -> SomeException Source # fromException :: SomeException -> Maybe ConnectError Source # displayException :: ConnectError -> String Source # backtraceDesired :: ConnectError -> Bool Source # | |
| Show ConnectError Source # | |
Defined in Database.Redis.Connection | |
| Eq ConnectError Source # | |
Defined in Database.Redis.Connection Methods (==) :: ConnectError -> ConnectError -> Bool Source # (/=) :: ConnectError -> ConnectError -> Bool Source # | |
connect :: ConnectInfo -> IO Connection Source #
Constructs a Connection pool to a Redis server designated by the
given ConnectInfo. The first connection is not actually established
until the first call to the server.
checkedConnect :: ConnectInfo -> IO Connection Source #
Constructs a Connection pool to a Redis server designated by the
given ConnectInfo, then tests if the server is actually there.
Throws an exception if the connection to the Redis server can't be
established.
disconnect :: Connection -> IO () Source #
Destroy all idle resources in the pool.
withConnect :: (MonadMask m, MonadIO m) => ConnectInfo -> (Connection -> m c) -> m c Source #
Memory bracket around connect and disconnect.
withCheckedConnect :: ConnectInfo -> (Connection -> IO c) -> IO c Source #
Memory bracket around checkedConnect and disconnect
data ConnectInfo Source #
Information for connnecting to a Redis server.
It is recommended to not use the ConnInfo data constructor directly.
Instead use defaultConnectInfo and update it with record syntax. For
example to connect to a password protected Redis server running on localhost
and listening to the default port:
myConnectInfo :: ConnectInfo
myConnectInfo = defaultConnectInfo {connectAuth = Just "secret"}
Constructors
| ConnInfo | |
Fields
| |
Instances
| Show ConnectInfo Source # | |
Defined in Database.Redis.Connection | |
defaultConnectInfo :: ConnectInfo Source #
Default information for connecting:
connectHost = "localhost" connectPort = PortNumber 6379 -- Redis default port connectAuth = Nothing -- No password connectDatabase = 0 -- SELECT database 0 connectMaxConnections = 50 -- Up to 50 connections connectMaxIdleTime = 30 -- Keep open for 30 seconds connectTimeout = Nothing -- Don't add timeout logic connectTLSParams = Nothing -- Do not use TLS
parseConnectInfo :: String -> Either String ConnectInfo Source #
Parse a from a URLConnectInfo
Username is ignored, path is used to specify the database:
>>>parseConnectInfo "redis://username:password@host:42/2"Right (ConnInfo {connectHost = "host", connectPort = PortNumber 42, connectAuth = Just "password", connectDatabase = 2, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing})
>>>parseConnectInfo "redis://username:password@host:42/db"Left "Invalid port: db"
The scheme is validated, to prevent mixing up configurations:
>>>parseConnectInfo "postgres://"Left "Wrong scheme"
Beyond that, all values are optional. Omitted values are taken from
:defaultConnectInfo
>>>parseConnectInfo "redis://"Right (ConnInfo {connectHost = "localhost", connectPort = PortNumber 6379, connectAuth = Nothing, connectDatabase = 0, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing})
connectCluster :: ConnectInfo -> IO Connection Source #
Constructs a ShardMap of connections to clustered nodes. The argument is
a ConnectInfo for any node in the cluster
Some Redis commands are currently not supported in cluster mode - CONFIG, AUTH - SCAN - MOVE, SELECT - PUBLISH, SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE, RESET
Constructors
| PortNumber PortNumber | |
| UnixSocket String |
Commands
Options for the sort command.
Constructors
| SortOpts | |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> SortOpts | |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | host |
| -> ByteString | port |
| -> ByteString | key |
| -> Integer | destinationDb |
| -> Integer | timeout |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | pattern |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => Cursor | |
| -> m (f (Cursor, [ByteString])) | next cursor and values |
data XReadResponse Source #
Constructors
| XReadResponse | |
Fields
| |
Instances
| Show XReadResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XReadResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XReadResponse -> XReadResponse -> Bool Source # (/=) :: XReadResponse -> XReadResponse -> Bool Source # | |
| RedisResult XReadResponse Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | newkey |
| -> m (f Status) |
clusterSlots :: RedisCtx m f => m (f ClusterSlotsResponse) Source #
data ClusterSlotsResponse Source #
Constructors
| ClusterSlotsResponse | |
Instances
data ClusterSlotsResponseEntry Source #
Constructors
| ClusterSlotsResponseEntry | |
Instances
data ClusterSlotsNode Source #
Constructors
| ClusterSlotsNode | |
Fields | |
Instances
| Show ClusterSlotsNode Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult ClusterSlotsNode Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | message |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f ByteString) |
data MigrateOpts Source #
Options for the migrate command.
Constructors
| MigrateOpts | |
Fields
| |
Instances
| Show MigrateOpts Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq MigrateOpts Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: MigrateOpts -> MigrateOpts -> Bool Source # (/=) :: MigrateOpts -> MigrateOpts -> Bool Source # | |
defaultMigrateOpts :: MigrateOpts Source #
Redis default MigrateOpts. Equivalent to omitting all optional parameters.
MigrateOpts
{ migrateCopy = False -- remove the key from the local instance
, migrateReplace = False -- don't replace existing key on the remote instance
}
Arguments
| :: RedisCtx m f | |
| => ByteString | host |
| -> ByteString | port |
| -> Integer | destinationDb |
| -> Integer | timeout |
| -> MigrateOpts | |
| -> [ByteString] | keys |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | millisecondsTimestamp |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | newkey |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | timeToLive |
| -> ByteString | serializedValue |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | timeToLive |
| -> ByteString | serializedValue |
| -> m (f Status) |
defaultScanOpts :: ScanOpts Source #
Redis default ScanOpts. Equivalent to omitting all optional parameters.
ScanOpts
{ scanMatch = Nothing -- don't match any pattern
, scanCount = Nothing -- don't set any requirements on number elements returned (works like value COUNT 10)
}
Arguments
| :: RedisCtx m f | |
| => Cursor | |
| -> ScanOpts | |
| -> m (f (Cursor, [ByteString])) | next cursor and values |
defaultSortOpts :: SortOpts Source #
Redis default SortOpts. Equivalent to omitting all optional parameters.
SortOpts
{ sortBy = Nothing -- omit the BY option
, sortLimit = (0,-1) -- return entire collection
, sortGet = [] -- omit the GET option
, sortOrder = Asc -- sort in ascending order
, sortAlpha = False -- sort numerically, not lexicographically
}
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | destination |
| -> SortOpts | |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | field |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f [(ByteString, ByteString)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> Integer | increment |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> Double | increment |
| -> m (f Double) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | field |
| -> m (f [Maybe ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [(ByteString, ByteString)] | fieldValue |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> m (f (Cursor, [(ByteString, ByteString)])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> ScanOpts | |
| -> m (f (Cursor, [(ByteString, ByteString)])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> ByteString | value |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | field |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destkey |
| -> [ByteString] | sourcekey |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> Integer | timeout |
| -> m (f (Maybe (ByteString, ByteString))) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> Integer | timeout |
| -> m (f (Maybe (ByteString, ByteString))) |
Arguments
| :: RedisCtx m f | |
| => ByteString | source |
| -> ByteString | destination |
| -> Integer | timeout |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | index |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | pivot |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | pivot |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | count |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | index |
| -> ByteString | value |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | source |
| -> ByteString | destination |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: (RedisCtx m f, RedisResult a) | |
| => ByteString | script |
| -> [ByteString] | keys |
| -> [ByteString] | args |
| -> m (f a) |
Arguments
| :: (RedisCtx m f, RedisResult a) | |
| => ByteString | base16-encoded sha1 hash of the script |
| -> [ByteString] | keys |
| -> [ByteString] | args |
| -> m (f a) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | script |
| -> m (f [Bool]) |
scriptFlush :: RedisCtx m f => m (f Status) Source #
scriptKill :: RedisCtx m f => m (f Status) Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | script |
| -> m (f ByteString) |
bgrewriteaof :: RedisCtx m f => m (f Status) Source #
clientGetname :: RedisCtx m f => m (f Status) Source #
clientList :: RedisCtx m f => m (f [ByteString]) Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | connectionName |
| -> m (f ByteString) |
commandCount :: RedisCtx m f => m (f Integer) Source #
Arguments
| :: RedisCtx m f | |
| => [ByteString] | commandName |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | parameter |
| -> m (f [(ByteString, ByteString)]) |
configResetstat :: RedisCtx m f => m (f Status) Source #
configRewrite :: RedisCtx m f => m (f Status) Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | parameter |
| -> ByteString | value |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f ByteString) |
info :: RedisCtx m f => m (f ByteString) Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | section |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => ByteString | host |
| -> ByteString | port |
| -> m (f Status) |
A single entry from the slowlog.
Constructors
| Slowlog | |
Fields
| |
slowlogLen :: RedisCtx m f => m (f Integer) Source #
slowlogReset :: RedisCtx m f => m (f Status) Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | member |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [ByteString] | key |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [ByteString] | key |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | member |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | source |
| -> ByteString | destination |
| -> ByteString | member |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | count |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | count |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | member |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> m (f (Cursor, [ByteString])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> ScanOpts | |
| -> m (f (Cursor, [ByteString])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [ByteString] | key |
| -> m (f Integer) |
Constructors
| ZaddOpts | |
Fields
| |
defaultZaddOpts :: ZaddOpts Source #
Redis default ZaddOpts. Equivalent to omitting all optional parameters.
ZaddOpts
{ zaddCondition = Nothing -- omit NX and XX options
, zaddChange = False -- don't modify the return value from the number of new elements added, to the total number of elements changed
, zaddIncrement = False -- don't add like ZINCRBY
}
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [(Double, ByteString)] | scoreMember |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [(Double, ByteString)] | scoreMember |
| -> ZaddOpts | options |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | increment |
| -> ByteString | member |
| -> m (f Double) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [ByteString] | keys |
| -> Aggregate | |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [(ByteString, Double)] | weighted keys |
| -> Aggregate | |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | min |
| -> ByteString | max |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f [(ByteString, Double)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> RangeLex ByteString | min |
| -> RangeLex ByteString | max |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> RangeLex ByteString | min |
| -> RangeLex ByteString | max |
| -> Integer | offset |
| -> Integer | count |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | min |
| -> Double | max |
| -> m (f [ByteString]) |
zrangebyscoreWithscores Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | min |
| -> Double | max |
| -> m (f [(ByteString, Double)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | min |
| -> Double | max |
| -> Integer | offset |
| -> Integer | count |
| -> m (f [ByteString]) |
zrangebyscoreWithscoresLimit Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | min |
| -> Double | max |
| -> Integer | offset |
| -> Integer | count |
| -> m (f [(ByteString, Double)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | member |
| -> m (f (Maybe Integer)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> [ByteString] | member |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | min |
| -> ByteString | max |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | min |
| -> Double | max |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f [ByteString]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | stop |
| -> m (f [(ByteString, Double)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | max |
| -> Double | min |
| -> m (f [ByteString]) |
zrevrangebyscoreWithscores Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | max |
| -> Double | min |
| -> m (f [(ByteString, Double)]) |
zrevrangebyscoreLimit Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | max |
| -> Double | min |
| -> Integer | offset |
| -> Integer | count |
| -> m (f [ByteString]) |
zrevrangebyscoreWithscoresLimit Source #
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | max |
| -> Double | min |
| -> Integer | offset |
| -> Integer | count |
| -> m (f [(ByteString, Double)]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | member |
| -> m (f (Maybe Integer)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> m (f (Cursor, [(ByteString, Double)])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Cursor | |
| -> ScanOpts | |
| -> m (f (Cursor, [(ByteString, Double)])) | next cursor and values |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | member |
| -> m (f (Maybe Double)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [ByteString] | keys |
| -> Aggregate | |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destination |
| -> [(ByteString, Double)] | weighted keys |
| -> Aggregate | |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | end |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destkey |
| -> [ByteString] | srckeys |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destkey |
| -> [ByteString] | srckeys |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destkey |
| -> [ByteString] | srckeys |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | destkey |
| -> ByteString | srckey |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | start |
| -> Integer | end |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f (Maybe ByteString)) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Double | increment |
| -> m (f Double) |
Arguments
| :: RedisCtx m f | |
| => [ByteString] | key |
| -> m (f [Maybe ByteString]) |
Arguments
| :: RedisCtx m f | |
| => [(ByteString, ByteString)] | keyValue |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => [(ByteString, ByteString)] | keyValue |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | milliseconds |
| -> ByteString | value |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> SetOpts | |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | offset |
| -> ByteString | value |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | seconds |
| -> ByteString | value |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | value |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> Integer | offset |
| -> ByteString | value |
| -> m (f Integer) |
defaultXreadOpts :: XReadOpts Source #
Redis default XReadOpts. Equivalent to omitting all optional parameters.
XReadOpts
{ block = Nothing -- Don't block waiting for more records
, recordCount = Nothing -- no record count
}
data StreamsRecord Source #
Constructors
| StreamsRecord | |
Fields
| |
Instances
| Show StreamsRecord Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq StreamsRecord Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: StreamsRecord -> StreamsRecord -> Bool Source # (/=) :: StreamsRecord -> StreamsRecord -> Bool Source # | |
| RedisResult StreamsRecord Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | id |
| -> [(ByteString, ByteString)] | (field, value) |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => ByteString | key |
| -> ByteString | id |
| -> [(ByteString, ByteString)] | (field, value) |
| -> TrimOpts | |
| -> m (f ByteString) |
Arguments
| :: RedisCtx m f | |
| => [(ByteString, ByteString)] | (stream, id) pairs |
| -> m (f (Maybe [XReadResponse])) |
Arguments
| :: RedisCtx m f | |
| => [(ByteString, ByteString)] | (stream, id) pairs |
| -> XReadOpts | Options |
| -> m (f (Maybe [XReadResponse])) |
Arguments
| :: RedisCtx m f | |
| => ByteString | group name |
| -> ByteString | consumer name |
| -> [(ByteString, ByteString)] | (stream, id) pairs |
| -> m (f (Maybe [XReadResponse])) |
Arguments
| :: RedisCtx m f | |
| => ByteString | group name |
| -> ByteString | consumer name |
| -> [(ByteString, ByteString)] | (stream, id) pairs |
| -> XReadOpts | Options |
| -> m (f (Maybe [XReadResponse])) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group name |
| -> [ByteString] | message IDs |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group name |
| -> ByteString | start ID |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> ByteString | id |
| -> m (f Status) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> m (f Bool) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> ByteString | consumer |
| -> m (f Integer) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | start |
| -> ByteString | end |
| -> Maybe Integer | COUNT |
| -> m (f [StreamsRecord]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | end |
| -> ByteString | start |
| -> Maybe Integer | COUNT |
| -> m (f [StreamsRecord]) |
data XPendingSummaryResponse Source #
Constructors
| XPendingSummaryResponse | |
Instances
| Show XPendingSummaryResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XPendingSummaryResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XPendingSummaryResponse -> XPendingSummaryResponse -> Bool Source # (/=) :: XPendingSummaryResponse -> XPendingSummaryResponse -> Bool Source # | |
| RedisResult XPendingSummaryResponse Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> Maybe ByteString | consumer |
| -> m (f XPendingSummaryResponse) |
data XPendingDetailRecord Source #
Constructors
| XPendingDetailRecord | |
Fields | |
Instances
| Show XPendingDetailRecord Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XPendingDetailRecord Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XPendingDetailRecord -> XPendingDetailRecord -> Bool Source # (/=) :: XPendingDetailRecord -> XPendingDetailRecord -> Bool Source # | |
| RedisResult XPendingDetailRecord Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> ByteString | startId |
| -> ByteString | endId |
| -> Integer | count |
| -> Maybe ByteString | consumer |
| -> m (f [XPendingDetailRecord]) |
data XClaimOpts Source #
Constructors
| XClaimOpts | |
Fields
| |
Instances
| Show XClaimOpts Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XClaimOpts Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XClaimOpts -> XClaimOpts -> Bool Source # (/=) :: XClaimOpts -> XClaimOpts -> Bool Source # | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> ByteString | consumer |
| -> Integer | min idle time |
| -> XClaimOpts | optional arguments |
| -> [ByteString] | message IDs |
| -> m (f [StreamsRecord]) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> ByteString | consumer |
| -> Integer | min idle time |
| -> XClaimOpts | optional arguments |
| -> [ByteString] | message IDs |
| -> m (f [ByteString]) |
data XInfoConsumersResponse Source #
Constructors
| XInfoConsumersResponse | |
Instances
| Show XInfoConsumersResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XInfoConsumersResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XInfoConsumersResponse -> XInfoConsumersResponse -> Bool Source # (/=) :: XInfoConsumersResponse -> XInfoConsumersResponse -> Bool Source # | |
| RedisResult XInfoConsumersResponse Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> ByteString | group |
| -> m (f [XInfoConsumersResponse]) |
data XInfoGroupsResponse Source #
Constructors
| XInfoGroupsResponse | |
Instances
| Show XInfoGroupsResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XInfoGroupsResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XInfoGroupsResponse -> XInfoGroupsResponse -> Bool Source # (/=) :: XInfoGroupsResponse -> XInfoGroupsResponse -> Bool Source # | |
| RedisResult XInfoGroupsResponse Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> m (f [XInfoGroupsResponse]) |
data XInfoStreamResponse Source #
Constructors
| XInfoStreamResponse | |
| XInfoStreamEmptyResponse | |
Instances
| Show XInfoStreamResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq XInfoStreamResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: XInfoStreamResponse -> XInfoStreamResponse -> Bool Source # (/=) :: XInfoStreamResponse -> XInfoStreamResponse -> Bool Source # | |
| RedisResult XInfoStreamResponse Source # | |
Defined in Database.Redis.ManualCommands | |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> m (f XInfoStreamResponse) |
Arguments
| :: RedisCtx m f | |
| => ByteString | stream |
| -> [ByteString] | message IDs |
| -> m (f Integer) |
data ClusterNodesResponse Source #
Constructors
| ClusterNodesResponse | |
Instances
| Show ClusterNodesResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq ClusterNodesResponse Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: ClusterNodesResponse -> ClusterNodesResponse -> Bool Source # (/=) :: ClusterNodesResponse -> ClusterNodesResponse -> Bool Source # | |
| RedisResult ClusterNodesResponse Source # | |
Defined in Database.Redis.ManualCommands | |
data ClusterNodesResponseEntry Source #
Constructors
Instances
| Show ClusterNodesResponseEntry Source # | |
Defined in Database.Redis.ManualCommands | |
| Eq ClusterNodesResponseEntry Source # | |
Defined in Database.Redis.ManualCommands Methods (==) :: ClusterNodesResponseEntry -> ClusterNodesResponseEntry -> Bool Source # (/=) :: ClusterNodesResponseEntry -> ClusterNodesResponseEntry -> Bool Source # | |
data ClusterNodesResponseSlotSpec Source #
Constructors
| ClusterNodesResponseSingleSlot Integer | |
| ClusterNodesResponseSlotRange Integer Integer | |
| ClusterNodesResponseSlotImporting Integer ByteString | |
| ClusterNodesResponseSlotMigrating Integer ByteString |
Instances
clusterNodes :: RedisCtx m f => m (f ClusterNodesResponse) Source #
clusterSetSlotNode :: RedisCtx m f => Integer -> ByteString -> m (f Status) Source #
clusterSetSlotImporting :: RedisCtx m f => Integer -> ByteString -> m (f Status) Source #
clusterSetSlotMigrating :: RedisCtx m f => Integer -> ByteString -> m (f Status) Source #
clusterGetKeysInSlot :: RedisCtx m f => Integer -> Integer -> m (f [ByteString]) Source #
Transactions
Arguments
| :: [ByteString] | key |
| -> Redis (Either Reply Status) |
Watch the given keys to determine execution of the MULTI/EXEC block (http://redis.io/commands/watch).
unwatch :: Redis (Either Reply Status) Source #
Forget about all watched keys (http://redis.io/commands/unwatch).
multiExec :: RedisTx (Queued a) -> Redis (TxResult a) Source #
Run commands inside a transaction. For documentation on the semantics of Redis transaction see http://redis.io/topics/transactions.
Inside the transaction block, command functions return their result wrapped
in a Queued. The Queued result is a proxy object for the actual
command's result, which will only be available after EXECing the
transaction.
Example usage (note how Queued 's Applicative instance is used to
combine the two individual results):
runRedis conn $ do
set "hello" "hello"
set "world" "world"
helloworld <- multiExec $ do
hello <- get "hello"
world <- get "world"
return $ (,) <$> hello <*> world
liftIO (print helloworld)
A Queued value represents the result of a command inside a transaction. It
is a proxy object for the actual result, which will only be available
after returning from a multiExec transaction.
Queued values are composable by utilizing the Functor, Applicative or
Monad interfaces.
Result of a multiExec transaction.
Constructors
| TxSuccess a | Transaction completed successfully. The wrapped value corresponds to
the |
| TxAborted | Transaction aborted due to an earlier |
| TxError String | At least one of the commands returned an |
Instances
Command-context inside of MULTI/EXEC transactions. Use multiExec to run
actions of this type.
In the RedisTx context, all commands return a Queued value. It is a
proxy object for the actual result, which will only be available after
finishing the transaction.
Instances
| MonadIO RedisTx Source # | |
| Applicative RedisTx Source # | |
Defined in Database.Redis.Transactions | |
| Functor RedisTx Source # | |
| Monad RedisTx Source # | |
| MonadRedis RedisTx Source # | |
| RedisCtx RedisTx Queued Source # | |
Defined in Database.Redis.Transactions Methods returnDecode :: RedisResult a => Reply -> RedisTx (Queued a) Source # | |
Pub/Sub
Encapsulates subscription changes. Use subscribe, unsubscribe,
psubscribe, punsubscribe or mempty to construct a value. Combine
values by using the Monoid interface, i.e. mappend and mconcat.
Arguments
| :: RedisCtx m f | |
| => ByteString | channel |
| -> ByteString | message |
| -> m (f Integer) |
Post a message to a channel (http://redis.io/commands/publish).
Listens to published messages on subscribed channels and channels matching the subscribed patterns. For documentation on the semantics of Redis Pub/Sub see http://redis.io/topics/pubsub.
The given callback function is called for each received message.
Subscription changes are triggered by the returned PubSub. To keep
subscriptions unchanged, the callback can return mempty.
Example: Subscribe to the "news" channel indefinitely.
pubSub (subscribe ["news"]) $ \msg -> do
putStrLn $ "Message from " ++ show (msgChannel msg)
return mempty
Example: Receive a single message from the "chat" channel.
pubSub (subscribe ["chat"]) $ \msg -> do
putStrLn $ "Message from " ++ show (msgChannel msg)
return $ unsubscribe ["chat"]
It should be noted that Redis Pub/Sub by its nature is asynchronous
so returning unsubscribe does not mean that callback won't be able
to receive any further messages. And to guarantee that you won't
won't process messages after unsubscription and won't unsubscribe
from the same channel more than once you need to use IORef or
something similar
Arguments
| :: [ByteString] | channel |
| -> PubSub |
Listen for messages published to the given channels (http://redis.io/commands/subscribe).
Arguments
| :: [ByteString] | channel |
| -> PubSub |
Stop listening for messages posted to the given channels (http://redis.io/commands/unsubscribe).
Arguments
| :: [ByteString] | pattern |
| -> PubSub |
Listen for messages published to channels matching the given patterns (http://redis.io/commands/psubscribe).
Arguments
| :: [ByteString] | pattern |
| -> PubSub |
Stop listening for messages posted to channels matching the given patterns (http://redis.io/commands/punsubscribe).
Arguments
| :: Connection | The connection pool |
| -> PubSubController | The controller which keeps track of all subscriptions and handlers |
| -> IO () | This action is executed once Redis acknowledges that all the subscriptions in
the controller are now subscribed. You can use this after an exception (such as
|
| -> IO () |
Open a connection to the Redis server, register to all channels in the PubSubController,
and process messages and subscription change requests forever. The only way this will ever
exit is if there is an exception from the network code or an unhandled exception
in a MessageCallback or PMessageCallback. For example, if the network connection to Redis
dies, pubSubForever will throw a ConnectionLost. When such an exception is
thrown, you can recall pubSubForever with the same PubSubController which will open a
new connection and resubscribe to all the channels which are tracked in the PubSubController.
The general pattern is therefore during program startup create a PubSubController and fork
a thread which calls pubSubForever in a loop (using an exponential backoff algorithm
such as the retry package to not hammer the Redis
server if it does die). For example,
myhandler :: ByteString -> IO ()
myhandler msg = putStrLn $ unpack $ decodeUtf8 msg
onInitialComplete :: IO ()
onInitialComplete = putStrLn "Redis acknowledged that mychannel is now subscribed"
main :: IO ()
main = do
conn <- connect defaultConnectInfo
pubSubCtrl <- newPubSubController [("mychannel", myhandler)] []
concurrently ( forever $
pubSubForever conn pubSubCtrl onInitialComplete
`catch` (\(e :: SomeException) -> do
putStrLn $ "Got error: " ++ show e
threadDelay $ 50*1000) -- TODO: use exponential backoff
) $ restOfYourProgram
{- elsewhere in your program, use pubSubCtrl to change subscriptions -}
At most one active pubSubForever can be running against a single PubSubController at any time. If
two active calls to pubSubForever share a single PubSubController there will be deadlocks. If
you do want to process messages using multiple connections to Redis, you can create more than one
PubSubController. For example, create one PubSubController for each getNumCapabilities
and then create a Haskell thread bound to each capability each calling pubSubForever in a loop.
This will create one network connection per controller/capability and allow you to
register separate channels and callbacks for each controller, spreading the load across the capabilities.
type RedisChannel = ByteString Source #
A Redis channel name
type RedisPChannel = ByteString Source #
A Redis pattern channel name
type MessageCallback = ByteString -> IO () Source #
A handler for a message from a subscribed channel. The callback is passed the message content.
Messages are processed synchronously in the receiving thread, so if the callback
takes a long time it will block other callbacks and other messages from being
received. If you need to move long-running work to a different thread, we suggest
you use TBQueue with a reasonable bound, so that if messages are arriving faster
than you can process them, you do eventually block.
If the callback throws an exception, the exception will be thrown from pubSubForever
which will cause the entire Redis connection for all subscriptions to be closed.
As long as you call pubSubForever in a loop you will reconnect to your subscribed
channels, but you should probably add an exception handler to each callback to
prevent this.
type PMessageCallback = RedisChannel -> ByteString -> IO () Source #
A handler for a message from a psubscribed channel. The callback is passed the channel the message was sent on plus the message content.
Similar to MessageCallback, callbacks are executed synchronously and any exceptions
are rethrown from pubSubForever.
data PubSubController Source #
A controller that stores a set of channels, pattern channels, and callbacks.
It allows you to manage Pub/Sub subscriptions and pattern subscriptions and alter them at
any time throughout the life of your program.
You should typically create the controller at the start of your program and then store it
through the life of your program, using addChannels and removeChannels to update the
current subscriptions.
Arguments
| :: MonadIO m | |
| => [(RedisChannel, MessageCallback)] | the initial subscriptions |
| -> [(RedisPChannel, PMessageCallback)] | the initial pattern subscriptions |
| -> m PubSubController |
Create a new PubSubController. Note that this does not subscribe to any channels, it just
creates the controller. The subscriptions will happen once pubSubForever is called.
currentChannels :: MonadIO m => PubSubController -> m [RedisChannel] Source #
Get the list of current channels in the PubSubController. WARNING! This might not
exactly reflect the subscribed channels in the Redis server, because there is a delay
between adding or removing a channel in the PubSubController and when Redis receives
and processes the subscription change request.
currentPChannels :: MonadIO m => PubSubController -> m [RedisPChannel] Source #
Get the list of current pattern channels in the PubSubController. WARNING! This might not
exactly reflect the subscribed channels in the Redis server, because there is a delay
between adding or removing a channel in the PubSubController and when Redis receives
and processes the subscription change request.
Arguments
| :: MonadIO m | |
| => PubSubController | |
| -> [(RedisChannel, MessageCallback)] | the channels to subscribe to |
| -> [(RedisPChannel, PMessageCallback)] | the channels to pattern subscribe to |
| -> m UnregisterCallbacksAction |
Add channels into the PubSubController, and if there is an active pubSubForever, send the subscribe
and psubscribe commands to Redis. The addChannels function is thread-safe. This function
does not wait for Redis to acknowledge that the channels have actually been subscribed; use
addChannelsAndWait for that.
You can subscribe to the same channel or pattern channel multiple times; the PubSubController keeps
a list of callbacks and executes each callback in response to a message.
The return value is an action UnregisterCallbacksAction which will unregister the callbacks,
which should typically used with bracket.
Arguments
| :: MonadIO m | |
| => PubSubController | |
| -> [(RedisChannel, MessageCallback)] | the channels to subscribe to |
| -> [(RedisPChannel, PMessageCallback)] | the channels to psubscribe to |
| -> m UnregisterCallbacksAction |
Call addChannels and then wait for Redis to acknowledge that the channels are actually subscribed.
Note that this function waits for all pending subscription change requests, so if you for example call
addChannelsAndWait from multiple threads simultaneously, they all will wait for all pending
subscription changes to be acknowledged by Redis (this is due to the fact that we just track the total
number of pending change requests sent to Redis and just wait until that count reaches zero).
This also correctly waits if the network connection dies during the subscription change. Say that the
network connection dies right after we send a subscription change to Redis. pubSubForever will throw
ConnectionLost and addChannelsAndWait will continue to wait. Once you recall pubSubForever
with the same PubSubController, pubSubForever will open a new connection, send subscription commands
for all channels in the PubSubController (which include the ones we are waiting for),
and wait for the responses from Redis. Only once we receive the response from Redis that it has subscribed
to all channels in PubSubController will addChannelsAndWait unblock and return.
removeChannels :: MonadIO m => PubSubController -> [RedisChannel] -> [RedisPChannel] -> m () Source #
Remove channels from the PubSubController, and if there is an active pubSubForever, send the
unsubscribe commands to Redis. Note that as soon as this function returns, no more callbacks will be
executed even if more messages arrive during the period when we request to unsubscribe from the channel
and Redis actually processes the unsubscribe request. This function is thread-safe.
If you remove all channels, the connection in pubSubForever to redis will stay open and waiting for
any new channels from a call to addChannels. If you really want to close the connection,
use killThread or cancel to kill the thread running
pubSubForever.
removeChannelsAndWait :: MonadIO m => PubSubController -> [RedisChannel] -> [RedisPChannel] -> m () Source #
Call removeChannels and then wait for all pending subscription change requests to be acknowledged
by Redis. This uses the same waiting logic as addChannelsAndWait. Since removeChannels immediately
notifies the PubSubController to start discarding messages, you likely don't need this function and
can just use removeChannels.
type UnregisterCallbacksAction = IO () Source #
An action that when executed will unregister the callbacks. It is returned from addChannels
or addChannelsAndWait and typically you would use it in bracket to guarantee that you
unsubscribe from channels. For example, if you are using websockets to distribute messages to
clients, you could use something such as:
websocketConn <- Network.WebSockets.acceptRequest pending
let mycallback msg = Network.WebSockets.sendTextData websocketConn msg
bracket (addChannelsAndWait ctrl [("hello", mycallback)] []) id $ const $ do
{- loop here calling Network.WebSockets.receiveData -}Low-Level Command API
sendRequest :: (RedisCtx m f, RedisResult a) => [ByteString] -> m (f a) Source #
sendRequest can be used to implement commands from experimental
versions of Redis. An example of how to implement a command is given
below.
-- |Redis DEBUG OBJECT command debugObject :: ByteString ->Redis(EitherReplyByteString) debugObject key =sendRequest["DEBUG", "OBJECT", key]
Low-level representation of replies from the Redis server.
Constructors
| SingleLine ByteString | |
| Error ByteString | |
| Integer Integer | |
| Bulk (Maybe ByteString) | |
| MultiBulk (Maybe [Reply]) |
Instances
| NFData Reply Source # | |||||
Defined in Database.Redis.Protocol | |||||
| Generic Reply Source # | |||||
Defined in Database.Redis.Protocol Associated Types
| |||||
| Show Reply Source # | |||||
| Eq Reply Source # | |||||
| RedisResult Reply Source # | |||||
| RedisCtx Redis (Either Reply) Source # | |||||
Defined in Database.Redis.Core Methods returnDecode :: RedisResult a => Reply -> Redis (Either Reply a) Source # | |||||
| type Rep Reply Source # | |||||
Defined in Database.Redis.Protocol type Rep Reply = D1 ('MetaData "Reply" "Database.Redis.Protocol" "hedis-0.15.2-85BTwDfbc1QIF0idjI5vYf" 'False) ((C1 ('MetaCons "SingleLine" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString)) :+: C1 ('MetaCons "Error" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString))) :+: (C1 ('MetaCons "Integer" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Integer)) :+: (C1 ('MetaCons "Bulk" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe ByteString))) :+: C1 ('MetaCons "MultiBulk" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe [Reply])))))) | |||||
Constructors
| Ok | |
| Pong | |
| Status ByteString |
Instances
| NFData Status Source # | |||||
Defined in Database.Redis.Types | |||||
| Generic Status Source # | |||||
Defined in Database.Redis.Types Associated Types
| |||||
| Show Status Source # | |||||
| Eq Status Source # | |||||
| RedisResult Status Source # | |||||
| type Rep Status Source # | |||||
Defined in Database.Redis.Types type Rep Status = D1 ('MetaData "Status" "Database.Redis.Types" "hedis-0.15.2-85BTwDfbc1QIF0idjI5vYf" 'False) (C1 ('MetaCons "Ok" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "Pong" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Status" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString)))) | |||||
class RedisResult a where Source #
Instances
| RedisResult ByteString Source # | |
Defined in Database.Redis.Types | |
| RedisResult ClusterNodesResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult ClusterSlotsNode Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult ClusterSlotsResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult ClusterSlotsResponseEntry Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult Cursor Source # | |
| RedisResult Slowlog Source # | |
| RedisResult StreamsRecord Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XInfoConsumersResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XInfoGroupsResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XInfoStreamResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XPendingDetailRecord Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XPendingSummaryResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult XReadResponse Source # | |
Defined in Database.Redis.ManualCommands | |
| RedisResult Reply Source # | |
| RedisResult RedisType Source # | |
| RedisResult Status Source # | |
| RedisResult Integer Source # | |
| RedisResult Bool Source # | |
| RedisResult Double Source # | |
| RedisResult a => RedisResult (Maybe a) Source # | |
| (RedisResult k, RedisResult v) => RedisResult [(k, v)] Source # | |
| RedisResult a => RedisResult [a] Source # | |
| (RedisResult a, RedisResult b) => RedisResult (a, b) Source # | |
data ConnectionLostException Source #
Constructors
| ConnectionLost |
Instances
newtype ConnectTimeout Source #
Constructors
| ConnectTimeout ConnectPhase |
Instances
| Exception ConnectTimeout Source # | |
Defined in Database.Redis.ConnectionContext Methods toException :: ConnectTimeout -> SomeException Source # fromException :: SomeException -> Maybe ConnectTimeout Source # | |
| Show ConnectTimeout Source # | |
Defined in Database.Redis.ConnectionContext | |
- Solution to Exercise
Type of expire inside a transaction:
expire :: ByteString -> Integer -> RedisTx (Queued Bool)
Type of lindex outside of a transaction:
lindex :: ByteString -> Integer -> Redis (Either Reply ByteString)
Instances
| Enum HashSlot Source # | |
Defined in Database.Redis.Cluster.HashSlot Methods succ :: HashSlot -> HashSlot Source # pred :: HashSlot -> HashSlot Source # toEnum :: Int -> HashSlot Source # fromEnum :: HashSlot -> Int Source # enumFrom :: HashSlot -> [HashSlot] Source # enumFromThen :: HashSlot -> HashSlot -> [HashSlot] Source # enumFromTo :: HashSlot -> HashSlot -> [HashSlot] Source # enumFromThenTo :: HashSlot -> HashSlot -> HashSlot -> [HashSlot] Source # | |
| Num HashSlot Source # | |
Defined in Database.Redis.Cluster.HashSlot Methods (+) :: HashSlot -> HashSlot -> HashSlot Source # (-) :: HashSlot -> HashSlot -> HashSlot Source # (*) :: HashSlot -> HashSlot -> HashSlot Source # negate :: HashSlot -> HashSlot Source # abs :: HashSlot -> HashSlot Source # signum :: HashSlot -> HashSlot Source # fromInteger :: Integer -> HashSlot Source # | |
| Integral HashSlot Source # | |
Defined in Database.Redis.Cluster.HashSlot Methods quot :: HashSlot -> HashSlot -> HashSlot Source # rem :: HashSlot -> HashSlot -> HashSlot Source # div :: HashSlot -> HashSlot -> HashSlot Source # mod :: HashSlot -> HashSlot -> HashSlot Source # quotRem :: HashSlot -> HashSlot -> (HashSlot, HashSlot) Source # divMod :: HashSlot -> HashSlot -> (HashSlot, HashSlot) Source # | |
| Real HashSlot Source # | |
Defined in Database.Redis.Cluster.HashSlot Methods toRational :: HashSlot -> Rational Source # | |
| Show HashSlot Source # | |
| Eq HashSlot Source # | |
| Ord HashSlot Source # | |
Defined in Database.Redis.Cluster.HashSlot | |
keyToSlot :: ByteString -> HashSlot Source #
Compute the hashslot associated with a key