
Akka-Stream based Redis Client for Scala
- Transport is akka-stream 2.5.x.
- Response parser is fastparse.
- monix.eval.Task support.
Add the following to your sbt build (Scala 2.11.x, 2.12.x):
resolvers += "Sonatype OSS Release Repository" at "https://oss.sonatype.org/content/repositories/releases/"
libraryDependencies += "com.github.j5ik2o" %% "reactive-redis-core" % "1.0.21"
resolvers += "Sonatype OSS Snapshot Repository" at "https://oss.sonatype.org/content/repositories/snapshots/"
libraryDependencies += "com.github.j5ik2o" %% "reactive-redis-core" % "1.0.22-SNAPSHOT"
| Command |
Support |
| CLUSTER ADDSLOTS |
TODO |
| CLUSTER ADDSLOTS |
TODO |
| CLUSTER ADDSCLUSTER COUNT-FAILURE-REPORTSLOTS |
TODO |
| CLUSTER COUNTKEYSINSLOT |
TODO |
| CLUSTER DELSLOTS |
TODO |
| CLUSTER FAILOVER |
TODO |
| CLUSTER FORGET |
TODO |
| CLUSTER GETKEYSINSLOT |
TODO |
| CLUSTER INFO |
TODO |
| CLUSTER KEYSLOT |
TODO |
| CLUSTER MEET |
TODO |
| CLUSTER NODES |
TODO |
| CLUSTER REPLICATE |
TODO |
| CLUSTER RESET |
TODO |
| CLUSTER SAVECONFIG |
TODO |
| CLUSTER SET-CONFIG-EPOCH |
TODO |
| CLUSTER SETSLOT |
TODO |
| CLUSTER SLAVES |
TODO |
| CLUSTER SLOTS |
TODO |
| READONLY |
TODO |
| READWRITE |
TODO |
| Command |
Support |
| AUTH |
Supported |
| ECHO |
Supported |
| PING |
Supported |
| QUIT |
Supported |
| SELECT |
Supported |
| SWAPDB |
Supported |
| Command |
Support |
| GEOADD |
TODO |
| GEODIST |
TODO |
| GEOHASH |
TODO |
| GEOPOS |
TODO |
| GEORADIUS |
TODO |
| GEORADIUSBYMEMBER |
TODO |
| Command |
Support |
| HDEL |
Supported |
| HEXISTS |
Supported |
| HGET |
Supported |
| HGETALL |
Supported |
| HINCRBY |
TODO |
| HINCRBYFLOAT |
TODO |
| HKEYS |
TODO |
| HLEN |
TODO |
| HMGET |
TODO |
| HMSET |
TODO |
| HSCAN |
TODO |
| HSET |
Supported |
| HSETNX |
Supported |
| HSTRLEN |
TODO |
| HVALS |
TODO |
| Command |
Support |
| PFADD |
TODO |
| PFCOUNT |
TODO |
| PFMERGE |
TODO |
| Command |
Support |
| DEL |
Supported |
| DUMP |
Supported |
| EXISTS |
Supported |
| EXPIRE |
Supported |
| EXPIREAT |
Supported |
| KEYS |
Supported |
| MIGRATE |
Supported |
| MOVE |
Supported |
| OBJECT |
Supported |
| PERSIST |
Supported |
| PEXPIRE |
Supported |
| PEXPIREAT |
Supported |
| PTTL |
Supported |
| RANDOMKEY |
Supported |
| RENAME |
Supported |
| RENAMENX |
Supported |
| RESTORE |
TODO |
| SCAN |
Supported |
| SORT |
Supported |
| TOUCH |
Supported |
| TTL |
Supported |
| TYPE |
Supported |
| UNLINK |
Supported |
| WAIT |
Supported |
| BLPOP |
Supported |
| BRPOP |
Supported |
| BRPOPLPUSH |
Supported |
| LINDEX |
|
| LINSERT |
|
| LLEN |
Supported |
| LPOP |
|
| LPUSH |
Supported |
| LPUSHX |
|
| LRANGE |
Supported |
| LREM |
|
| LSET |
|
| LTRIM |
|
| RPOP |
|
| RPOPLPUSH |
|
| RPUSH |
Supported |
| RPUSHX |
|
| PSUBSCRIBE |
|
| PUBLISH |
|
| PUBSUB |
|
| PUNSUBSCRIBE |
|
| SUBSCRIBE |
|
| UNSUBSCRIBE |
|
| EVAL |
|
| EVALSHA |
|
| SCRIPT DEBUG |
|
| SCRIPT EXISTS |
|
| SCRIPT FLUSH |
|
| SCRIPT KILL |
|
| SCRIPT LOAD |
|
| BGREWRITEAOF |
|
| BGSAVE |
|
| CLIENT GETNAME |
|
| CLIENT KILL |
|
| CLIENT LIST |
|
| CLIENT PAUSE |
|
| CLIENT REPLY |
|
| CLIENT SETNAME |
|
| COMMAND |
|
| COMMAND COUNT |
|
| COMMAND GETKEYS |
|
| COMMAND INFO |
|
| CONFIG GET |
|
| CONFIG RESETSTAT |
|
| CONFIG REWRITE |
|
| CONFIG SET |
|
| DBSIZE |
|
| DEBUG OBJECT |
|
| DEBUG SEGFAULT |
|
| FLUSHALL |
|
| FLUSHDB |
|
| INFO |
|
| LASTSAVE |
|
| MEMORY DOCTOR |
|
| MEMORY HELP |
|
| MEMORY MALLOC-STATS |
|
| MEMORY PURGE |
|
| MEMORY STATS |
|
| MEMORY USAGE |
|
| MONITOR |
|
| ROLE |
|
| SAVE |
|
| SHUTDOWN |
|
| SLAVEOF |
|
| SLOWLOG |
|
| SYNC |
|
| TIME |
|
| Command |
Support |
| SADD |
Supported |
| SCARD |
TODO |
| SDIFF |
TODO |
| SDIFFSTORE |
TODO |
| SINTER |
TODO |
| SINTERSTORE |
TODO |
| SISMEMBER |
TODO |
| SMEMBERS |
TODO |
| SMOVE |
TODO |
| SPOP |
TODO |
| SRANDMEMBER |
TODO |
| SREM |
TODO |
| SSCAN |
TODO |
| SUNION |
TODO |
| SUNIONSTORE |
TODO |
| Command |
Support |
| BZPOPMAX |
TODO |
| BZPOPMIN |
TODO |
| ZADD |
TODO |
| ZCARD |
TODO |
| ZCOUNT |
TODO |
| ZINCRBY |
TODO |
| ZINTERSTORE |
TODO |
| ZLEXCOUNT |
TODO |
| ZPOPMAX |
TODO |
| ZPOPMIN |
TODO |
| ZRANGE |
TODO |
| ZRANGEBYLEX |
TODO |
| ZRANGEBYSCORE |
TODO |
| ZRANK |
TODO |
| ZREM |
TODO |
| ZREMRANGEBYLEX |
TODO |
| ZREMRANGEBYRANK |
TODO |
| ZREMRANGEBYSCORE |
TODO |
| ZREVRANGE |
TODO |
| ZREVRANGEBYLEX |
TODO |
| ZREVRANGEBYSCORE |
TODO |
| ZREVRANK |
TODO |
| ZSCAN |
TODO |
| ZSCORE |
TODO |
| ZUNIONSTORE |
TODO |
| Command |
Support |
| XADD |
TODO |
| XLEN |
TODO |
| XPENDING |
TODO |
| XRANGE |
TODO |
| XREAD |
TODO |
| XREADGROUP |
TODO |
| XREVRANGE |
TODO |
| Command |
Support |
| APPEND |
Supported |
| BITCOUNT |
Supported |
| BITFIELD |
Supported |
| BITOP |
Supported |
| BITPOS |
Supported |
| DECR |
Supported |
| DECRBY |
Supported |
| GET |
Supported |
| GETBIT |
Supported |
| GETRANGE |
Supported |
| GETSET |
Supported |
| INCR |
Supported |
| INCRBY |
Supported |
| INCRBYFLOAT |
Supported |
| MGET |
Supported |
| MSET |
Supported |
| MSETNX |
Supported |
| PSETEX |
Supported |
| SET |
Supported |
| SETBIT |
Supported |
| SETEX |
Supported |
| SETNX |
Supported |
| SETRANGE |
Supported |
| STRLEN |
Supported |
| Command |
Support |
| DISCARD |
Supported |
| EXEC |
Supported |
| MULTI |
Supported |
| UNWATCH |
Supported |
| WATCH |
Supported |
import monix.execution.Scheduler.Implicits.global
implicit val system = ActorSystem()
val peerConfig = PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6379))
val connection = RedisConnection(peerConfig)
val client = RedisClient()
val result = (for{
_ <- client.set("foo", "bar")
r <- client.get("foo")
} yield r).run(connection).runAsync
println(result) // bar
import monix.execution.Scheduler.Implicits.global
implicit val system = ActorSystem()
val peerConfig = PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6379))
val pool = RedisConnectionPool.ofRoundRobin(sizePerPeer = 5, Seq(peerConfig), RedisConnection(_)) // powered by RoundRobinPool
val connection = RedisConnection(connectionConfig)
val client = RedisClient()
// Fucntion style
val result1 = pool.withConnectionF{ con =>
(for{
_ <- client.set("foo", "bar")
r <- client.get("foo")
} yield r).run(con)
}.runAsync
println(result1) // bar
// Monadic style
val result2 = (for {
_ <- ConnectionAutoClose(pool)(client.set("foo", "bar").run)
r <- ConnectionAutoClose(pool)(client.get("foo").run)
} yield r).run().runAsync
println(result2) // bar
if you want to use other pooling implementation, please select from the following modules.
- reactive-redis-pool-commons (commons-pool2)
- reactive-redis-pool-scala (scala-pool)
- reactive-redis-pool-fop (fast-object-pool)
- reactive-redis-pool-stormpot (stormpot)
Master & Slaves aggregate connection
import monix.execution.Scheduler.Implicits.global
implicit val system = ActorSystem()
val masterPeerConfig = PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6379))
val slavePeerConfigs = Seq(
PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6380)),
PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6381)),
PeerConfig(remoteAddress = new InetSocketAddress("127.0.0.1", 6382))
)
val connection = new RedisMasterSlavesConnection(
masterConnectionPoolFactory = RedisConnectionPool.ofRoundRobin(sizePerPeer = 2, Seq(masterPeerConfig), RedisConnection(_)),
slaveConnectionPoolFactory = RedisConnectionPool.ofRoundRobin(sizePerPeer = 2, slavePeerConfigs, RedisConnection(_))
)
val client = RedisClient()
val result = (for{
_ <- client.set("foo", "bar") // write to master
r <- client.get("foo") // read from any slave
} yield r).run(connection).runAsync
println(result) // bar
MIT License / Copyright (c) 2016 Junichi Kato