redis
redis copied to clipboard
efficient client ⚡️
About
… a Redis client for the Go programming language.
- Boring API with full type-safety
- Automatic pipelining on concurrency
- High throughput despite low footprint
- Efficient OS and network utilization
- Robust error recovery
Network I/O is executed in the same goroutine that invoked the Client. There is no internal error reporting/logging by design.
This is free and unencumbered software released into the public domain.
Synchonous Command Execution
// Redis is a thread-safe connection establishment.
var Redis = redis.NewClient("rds1.example.com", time.Second/2, 0)
// Grow adds a string to a list.
func Grow() {
newLen, err := Redis.RPUSHString("demo_list", "hello")
if err != nil {
log.Print("demo_list update error: ", err)
return
}
log.Printf("demo_list has %d elements", newLen)
}
// Ping pushes a message to a publish–subscribe channel.
func Ping() {
clientCount, err := Redis.PUBLISHString("demo_channel", "ping")
if err != nil {
log.Print("demo_channel publish error: ", err)
return
}
log.Printf("pinged %d clients in demo_channel", clientCount)
}
Zero-Copy Pub/Sub Reception
// RedisListener is a thread-safe connection establishment.
var RedisListener = redis.NewListener(redis.ListenerConfig{
Func: func(channel string, message []byte, err error) {
switch err {
case nil:
log.Printf("received %q on %q", message, channel)
case redis.ErrClosed:
log.Print("subscription establishment terminated")
case io.ErrShortBuffer: // see ListenerConfig BufferSize
log.Printf("message on %q skipped due size", channel)
default:
log.Print("subscription error: ", err)
// recovery attempts follow automatically
}
},
Addr: "rds1.example.com:6379",
})
// Peek listens shortly to a publish–subscribe channel.
func Peek() {
RedisListener.SUBSCRIBE("demo_channel")
time.Sleep(time.Second)
RedisListener.UNSUBSCRIBE("demo_channel")
}
Performance
Note how memory allocations are limited to user data only. The publish–subscribe pattern is entirely allocation free.
The following results were measured on an Intel i5-7500. Unix domain sockets can make a big improvement over TCP.
name tcp time/op unix time/op delta
SimpleString/sequential-4 31.1µs ± 1% 15.2µs ± 0% -51.06% (p=0.000 n=9+10)
SimpleString/parallel-4 9.75µs ± 3% 4.74µs ±13% -51.34% (p=0.000 n=10+10)
Integer/sequential-4 30.3µs ± 1% 14.4µs ± 0% -52.69% (p=0.000 n=10+10)
Integer/parallel-4 9.84µs ±13% 4.45µs ± 9% -54.81% (p=0.000 n=10+10)
Blob/8B/sequential/bytes-4 31.0µs ± 1% 14.7µs ± 0% -52.71% (p=0.000 n=10+10)
Blob/8B/sequential/string-4 31.1µs ± 1% 14.7µs ± 0% -52.84% (p=0.000 n=8+10)
Blob/8B/parallel/bytes-4 9.76µs ± 4% 4.52µs ± 6% -53.75% (p=0.000 n=10+10)
Blob/8B/parallel/string-4 9.84µs ± 5% 4.60µs ± 9% -53.30% (p=0.000 n=10+10)
Blob/800B/sequential/bytes-4 32.8µs ± 1% 16.2µs ± 1% -50.69% (p=0.000 n=10+9)
Blob/800B/sequential/string-4 32.8µs ± 1% 16.2µs ± 0% -50.42% (p=0.000 n=10+10)
Blob/800B/parallel/bytes-4 10.4µs ± 7% 5.3µs ± 5% -49.08% (p=0.000 n=10+10)
Blob/800B/parallel/string-4 10.5µs ± 6% 5.8µs ± 6% -44.79% (p=0.000 n=10+10)
Blob/24000B/sequential/bytes-4 45.2µs ± 1% 43.9µs ± 1% -2.83% (p=0.000 n=9+10)
Blob/24000B/parallel/bytes-4 20.3µs ±10% 35.7µs ± 1% +76.33% (p=0.000 n=10+10)
Array/1×8B/sequential/bytes-4 32.7µs ± 2% 16.9µs ± 0% -48.37% (p=0.000 n=10+10)
Array/1×8B/sequential/string-4 32.7µs ± 2% 16.8µs ± 0% -48.42% (p=0.000 n=10+10)
Array/1×8B/parallel/bytes-4 10.4µs ± 5% 5.4µs ± 5% -47.63% (p=0.000 n=9+10)
Array/1×8B/parallel/string-4 10.4µs ± 6% 5.4µs ± 3% -48.15% (p=0.000 n=10+9)
Array/12×8B/sequential/bytes-4 34.9µs ± 1% 18.5µs ± 1% -46.92% (p=0.000 n=9+10)
Array/12×8B/sequential/string-4 34.6µs ± 1% 18.3µs ± 0% -46.93% (p=0.000 n=9+10)
Array/12×8B/parallel/bytes-4 11.5µs ± 4% 6.2µs ± 6% -46.07% (p=0.000 n=10+10)
Array/12×8B/parallel/string-4 11.1µs ± 7% 6.3µs ± 5% -43.60% (p=0.000 n=10+10)
Array/144×8B/sequential/bytes-4 53.1µs ± 1% 33.9µs ± 0% -36.05% (p=0.000 n=10+9)
Array/144×8B/sequential/string-4 52.4µs ± 0% 33.4µs ± 1% -36.29% (p=0.000 n=8+10)
Array/144×8B/parallel/bytes-4 19.1µs ± 5% 14.4µs ± 1% -24.61% (p=0.000 n=10+10)
Array/144×8B/parallel/string-4 19.0µs ± 6% 14.1µs ± 1% -26.07% (p=0.000 n=10+9)
PubSub/8B/1publishers-4 11.2µs ± 4% 5.6µs ± 0% -50.28% (p=0.000 n=10+8)
PubSub/8B/2publishers-4 7.18µs ±10% 3.96µs ± 4% -44.85% (p=0.000 n=10+9)
PubSub/8B/16publishers-4 2.27µs ± 5% 1.94µs ± 4% -14.63% (p=0.000 n=10+10)
PubSub/800B/1publishers-4 12.0µs ± 6% 6.0µs ± 3% -49.73% (p=0.000 n=10+10)
PubSub/800B/2publishers-4 7.67µs ± 4% 4.58µs ± 1% -40.30% (p=0.000 n=10+8)
PubSub/800B/16publishers-4 2.85µs ±14% 3.19µs ± 2% +11.64% (p=0.000 n=9+10)
PubSub/24000B/1publishers-4 32.5µs ± 9% 41.3µs ± 2% +27.17% (p=0.000 n=10+9)
PubSub/24000B/2publishers-4 33.0µs ±10% 41.3µs ± 2% +25.03% (p=0.000 n=10+9)
PubSub/24000B/16publishers-4 30.5µs ± 5% 42.4µs ± 4% +39.17% (p=0.000 n=10+10)
name tcp alloc/op unix alloc/op delta
SimpleString/sequential-4 0.00B 0.00B ~ (all equal)
SimpleString/parallel-4 0.00B 0.00B ~ (all equal)
Integer/sequential-4 0.00B 0.00B ~ (all equal)
Integer/parallel-4 0.00B 0.00B ~ (all equal)
Blob/8B/sequential/bytes-4 8.00B ± 0% 8.00B ± 0% ~ (all equal)
Blob/8B/sequential/string-4 8.00B ± 0% 8.00B ± 0% ~ (all equal)
Blob/8B/parallel/bytes-4 8.00B ± 0% 8.00B ± 0% ~ (all equal)
Blob/8B/parallel/string-4 8.00B ± 0% 8.00B ± 0% ~ (all equal)
Blob/800B/sequential/bytes-4 896B ± 0% 896B ± 0% ~ (all equal)
Blob/800B/sequential/string-4 896B ± 0% 896B ± 0% ~ (all equal)
Blob/800B/parallel/bytes-4 896B ± 0% 896B ± 0% ~ (all equal)
Blob/800B/parallel/string-4 896B ± 0% 896B ± 0% ~ (all equal)
Blob/24000B/sequential/bytes-4 24.6kB ± 0% 24.6kB ± 0% -0.01% (p=0.002 n=8+10)
Blob/24000B/parallel/bytes-4 24.6kB ± 0% 24.6kB ± 0% +0.00% (p=0.000 n=10+10)
Array/1×8B/sequential/bytes-4 40.0B ± 0% 40.0B ± 0% ~ (all equal)
Array/1×8B/sequential/string-4 24.0B ± 0% 24.0B ± 0% ~ (all equal)
Array/1×8B/parallel/bytes-4 40.0B ± 0% 40.0B ± 0% ~ (all equal)
Array/1×8B/parallel/string-4 24.0B ± 0% 24.0B ± 0% ~ (all equal)
Array/12×8B/sequential/bytes-4 384B ± 0% 384B ± 0% ~ (all equal)
Array/12×8B/sequential/string-4 288B ± 0% 288B ± 0% ~ (all equal)
Array/12×8B/parallel/bytes-4 384B ± 0% 384B ± 0% ~ (all equal)
Array/12×8B/parallel/string-4 288B ± 0% 288B ± 0% ~ (all equal)
Array/144×8B/sequential/bytes-4 4.61kB ± 0% 4.61kB ± 0% ~ (all equal)
Array/144×8B/sequential/string-4 3.46kB ± 0% 3.46kB ± 0% ~ (all equal)
Array/144×8B/parallel/bytes-4 4.61kB ± 0% 4.61kB ± 0% ~ (all equal)
Array/144×8B/parallel/string-4 3.46kB ± 0% 3.46kB ± 0% ~ (all equal)
PubSub/8B/1publishers-4 0.00B 0.00B ~ (all equal)
PubSub/8B/2publishers-4 0.00B 0.00B ~ (all equal)
PubSub/8B/16publishers-4 0.00B 0.00B ~ (all equal)
PubSub/800B/1publishers-4 0.00B 0.00B ~ (all equal)
PubSub/800B/2publishers-4 0.00B 0.00B ~ (all equal)
PubSub/800B/16publishers-4 0.00B 0.00B ~ (all equal)
PubSub/24000B/1publishers-4 2.60B ±23% 3.33B ±50% +28.21% (p=0.037 n=10+9)
PubSub/24000B/2publishers-4 5.00B ± 0% 7.60B ±21% +52.00% (p=0.000 n=8+10)
PubSub/24000B/16publishers-4 40.4B ±11% 57.4B ±10% +42.08% (p=0.000 n=10+10)
name tcp allocs/op unix allocs/op delta
SimpleString/sequential-4 0.00 0.00 ~ (all equal)
SimpleString/parallel-4 0.00 0.00 ~ (all equal)
Integer/sequential-4 0.00 0.00 ~ (all equal)
Integer/parallel-4 0.00 0.00 ~ (all equal)
Blob/8B/sequential/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/8B/sequential/string-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/8B/parallel/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/8B/parallel/string-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/800B/sequential/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/800B/sequential/string-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/800B/parallel/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/800B/parallel/string-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/24000B/sequential/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Blob/24000B/parallel/bytes-4 1.00 ± 0% 1.00 ± 0% ~ (all equal)
Array/1×8B/sequential/bytes-4 2.00 ± 0% 2.00 ± 0% ~ (all equal)
Array/1×8B/sequential/string-4 2.00 ± 0% 2.00 ± 0% ~ (all equal)
Array/1×8B/parallel/bytes-4 2.00 ± 0% 2.00 ± 0% ~ (all equal)
Array/1×8B/parallel/string-4 2.00 ± 0% 2.00 ± 0% ~ (all equal)
Array/12×8B/sequential/bytes-4 13.0 ± 0% 13.0 ± 0% ~ (all equal)
Array/12×8B/sequential/string-4 13.0 ± 0% 13.0 ± 0% ~ (all equal)
Array/12×8B/parallel/bytes-4 13.0 ± 0% 13.0 ± 0% ~ (all equal)
Array/12×8B/parallel/string-4 13.0 ± 0% 13.0 ± 0% ~ (all equal)
Array/144×8B/sequential/bytes-4 145 ± 0% 145 ± 0% ~ (all equal)
Array/144×8B/sequential/string-4 145 ± 0% 145 ± 0% ~ (all equal)
Array/144×8B/parallel/bytes-4 145 ± 0% 145 ± 0% ~ (all equal)
Array/144×8B/parallel/string-4 145 ± 0% 145 ± 0% ~ (all equal)
PubSub/8B/1publishers-4 0.00 0.00 ~ (all equal)
PubSub/8B/2publishers-4 0.00 0.00 ~ (all equal)
PubSub/8B/16publishers-4 0.00 0.00 ~ (all equal)
PubSub/800B/1publishers-4 0.00 0.00 ~ (all equal)
PubSub/800B/2publishers-4 0.00 0.00 ~ (all equal)
PubSub/800B/16publishers-4 0.00 0.00 ~ (all equal)
PubSub/24000B/1publishers-4 0.00 0.00 ~ (all equal)
PubSub/24000B/2publishers-4 0.00 0.00 ~ (all equal)
PubSub/24000B/16publishers-4 0.00 0.00 ~ (all equal)
name tcp speed unix speed delta
Blob/8B/sequential/bytes-4 260kB/s ± 0% 547kB/s ± 1% +110.38% (p=0.000 n=10+10)
Blob/8B/sequential/string-4 260kB/s ± 0% 543kB/s ± 1% +108.85% (p=0.000 n=9+10)
Blob/8B/parallel/bytes-4 821kB/s ± 4% 1773kB/s ± 6% +115.96% (p=0.000 n=10+10)
Blob/8B/parallel/string-4 813kB/s ± 5% 1743kB/s ± 8% +114.39% (p=0.000 n=10+10)
Blob/800B/sequential/bytes-4 24.4MB/s ± 1% 49.4MB/s ± 1% +102.80% (p=0.000 n=10+9)
Blob/800B/sequential/string-4 24.4MB/s ± 1% 49.2MB/s ± 0% +101.71% (p=0.000 n=10+10)
Blob/800B/parallel/bytes-4 77.0MB/s ± 7% 151.0MB/s ± 5% +96.23% (p=0.000 n=10+10)
Blob/800B/parallel/string-4 76.6MB/s ± 6% 138.7MB/s ± 6% +81.11% (p=0.000 n=10+10)
Blob/24000B/sequential/bytes-4 531MB/s ± 1% 546MB/s ± 1% +2.91% (p=0.000 n=9+10)
Blob/24000B/parallel/bytes-4 1.19GB/s ±10% 0.67GB/s ± 1% -43.43% (p=0.000 n=10+10)
Array/1×8B/sequential/bytes-4 246kB/s ± 2% 470kB/s ± 0% +91.06% (p=0.000 n=10+8)
Array/1×8B/sequential/string-4 244kB/s ± 2% 474kB/s ± 1% +94.26% (p=0.000 n=10+10)
Array/1×8B/parallel/bytes-4 773kB/s ± 6% 1477kB/s ± 5% +90.99% (p=0.000 n=9+10)
Array/1×8B/parallel/string-4 769kB/s ± 5% 1470kB/s ± 7% +91.16% (p=0.000 n=10+10)
Array/12×8B/sequential/bytes-4 2.75MB/s ± 1% 5.18MB/s ± 1% +88.48% (p=0.000 n=9+10)
Array/12×8B/sequential/string-4 2.78MB/s ± 1% 5.23MB/s ± 0% +88.35% (p=0.000 n=9+10)
Array/12×8B/parallel/bytes-4 8.34MB/s ± 4% 15.47MB/s ± 6% +85.53% (p=0.000 n=10+10)
Array/12×8B/parallel/string-4 8.67MB/s ± 8% 15.35MB/s ± 5% +77.10% (p=0.000 n=10+10)
Array/144×8B/sequential/bytes-4 21.7MB/s ± 1% 34.0MB/s ± 0% +56.38% (p=0.000 n=10+9)
Array/144×8B/sequential/string-4 22.0MB/s ± 0% 34.5MB/s ± 0% +56.96% (p=0.000 n=8+10)
Array/144×8B/parallel/bytes-4 60.3MB/s ± 5% 79.9MB/s ± 1% +32.59% (p=0.000 n=10+10)
Array/144×8B/parallel/string-4 60.6MB/s ± 6% 81.9MB/s ± 1% +35.12% (p=0.000 n=10+9)
PubSub/8B/1publishers-4 715kB/s ± 3% 1439kB/s ± 1% +101.22% (p=0.000 n=10+8)
PubSub/8B/2publishers-4 1.12MB/s ±11% 2.03MB/s ± 1% +81.74% (p=0.000 n=10+8)
PubSub/8B/16publishers-4 3.52MB/s ± 5% 4.12MB/s ± 4% +17.04% (p=0.000 n=10+10)
PubSub/800B/1publishers-4 67.0MB/s ± 6% 133.2MB/s ± 3% +98.77% (p=0.000 n=10+10)
PubSub/800B/2publishers-4 104MB/s ± 4% 174MB/s ± 2% +66.97% (p=0.000 n=10+9)
PubSub/800B/16publishers-4 275MB/s ±22% 251MB/s ± 2% -8.78% (p=0.002 n=10+10)
PubSub/24000B/1publishers-4 741MB/s ± 9% 581MB/s ± 2% -21.61% (p=0.000 n=10+9)
PubSub/24000B/2publishers-4 729MB/s ±11% 581MB/s ± 2% -20.23% (p=0.000 n=10+9)
PubSub/24000B/16publishers-4 788MB/s ± 4% 566MB/s ± 4% -28.17% (p=0.000 n=10+10)
name tcp ns/delay unix ns/delay delta
PubSub/8B/1publishers-4 48.4k ± 3% 20.9k ± 0% -56.84% (p=0.000 n=10+8)
PubSub/8B/2publishers-4 58.2k ± 9% 27.6k ± 1% -52.52% (p=0.000 n=10+8)
PubSub/8B/16publishers-4 150k ± 3% 114k ± 1% -24.05% (p=0.000 n=8+10)
PubSub/800B/1publishers-4 51.7k ± 6% 22.8k ± 4% -55.98% (p=0.000 n=10+10)
PubSub/800B/2publishers-4 62.1k ± 4% 33.1k ± 3% -46.71% (p=0.000 n=10+10)
PubSub/800B/16publishers-4 207k ±29% 33119k ±23% +15901.25% (p=0.000 n=10+9)
PubSub/24000B/1publishers-4 140k ± 8% 7430k ±169% +5211.72% (p=0.000 n=10+10)
PubSub/24000B/2publishers-4 274k ±10% 8110k ±125% +2862.26% (p=0.000 n=10+10)
PubSub/24000B/16publishers-4 1.96M ± 5% 3.23M ±24% +64.95% (p=0.000 n=10+9)
name tcp ns/publish unix ns/publish delta
PubSub/8B/1publishers-4 44.7k ± 4% 22.2k ± 0% -50.27% (p=0.000 n=10+8)
PubSub/8B/2publishers-4 57.4k ±10% 31.7k ± 4% -44.85% (p=0.000 n=10+9)
PubSub/8B/16publishers-4 145k ± 5% 124k ± 4% -14.60% (p=0.000 n=10+10)
PubSub/800B/1publishers-4 47.8k ± 6% 24.0k ± 3% -49.73% (p=0.000 n=10+10)
PubSub/800B/2publishers-4 61.3k ± 4% 36.6k ± 1% -40.30% (p=0.000 n=10+8)
PubSub/800B/16publishers-4 182k ±14% 202k ± 2% +10.63% (p=0.000 n=9+10)
PubSub/24000B/1publishers-4 130k ± 9% 164k ± 2% +26.48% (p=0.000 n=10+9)
PubSub/24000B/2publishers-4 264k ±10% 328k ± 2% +24.16% (p=0.000 n=10+9)
PubSub/24000B/16publishers-4 1.95M ± 5% 2.71M ± 4% +39.09% (p=0.000 n=10+10)