Description
A RESP protocol implementation and multiplexed Redis client library.
Description
hask-redis-mux provides a full RESP protocol parser, Redis client with TLS support, CRC16 hash slot computation, and a multiplexed Redis Cluster client with connection pooling and automatic topology discovery.
README.md
hask-redis-mux
A multiplexed Redis client library for Haskell with full RESP protocol support, Redis Cluster topology discovery, connection pooling, and TLS.
Features
- Standalone & Cluster — works with single-node Redis and Redis Cluster
- Multiplexed pipelining — concurrent commands share a single TCP connection
- Typed returns via
FromResp— parse responses asByteString,Integer,Text,Bool, or custom types - TLS support — connect over TLS with
crypton - Bracket-style resource management —
withStandaloneClient/withClusterClientfor exception-safe cleanup - Connection pooling — automatic pool management for cluster nodes
Installation
Add to your .cabal file:
build-depends: hask-redis-mux >= 0.1 && < 0.2
Quick Start
{-# LANGUAGE OverloadedStrings #-}
import Database.Redis
main :: IO ()
main = do
-- Connect to localhost:6379, run commands, auto-close
result <- runRedis defaultStandaloneConfig $ do
set "greeting" "hello"
(val :: ByteString) <- get "greeting"
return val
print result -- "hello"
Typed Returns with FromResp
Commands return polymorphic types via the FromResp typeclass. Just add a type annotation and the response is parsed automatically:
runRedis defaultStandaloneConfig $ do
set "counter" "42"
(n :: Integer) <- get "counter" -- 42
(bs :: ByteString) <- get "counter" -- "42"
(mt :: Maybe Text) <- get "missing" -- Nothing
(ok :: Bool) <- set "k" "v" -- True (from +OK)
Bracket Pattern (Recommended)
Use bracket-style functions for exception-safe resource management:
-- Standalone
withStandaloneClient config $ \client ->
runStandaloneClient client $ do
set "key" "value"
get "key"
-- Cluster
withClusterClient clusterConfig connector $ \client ->
runClusterCommandClient client $ do
set "key" "value"
get "key"
Custom Configuration
import Database.Redis
main :: IO ()
main = do
let config = StandaloneConfig
{ standaloneNodeAddress = NodeAddress "redis.example.com" 6379
, standaloneConnector = clusterPlaintextConnector
, standaloneMultiplexerCount = 4 -- 4 multiplexed connections
}
withStandaloneClient config $ \client ->
runStandaloneClient client $ do
set "key" "value"
Documentation
License
MIT — see LICENSE for details.