# README
Redis client for Golang
Supports:
- Redis 3 commands except QUIT, MONITOR, SLOWLOG and SYNC.
- Automatic connection pooling with circuit breaker support.
- Pub/Sub.
- Transactions.
- Pipeline and TxPipeline.
- Scripting.
- Timeouts.
- Redis Sentinel.
- Redis Cluster.
- Cluster of Redis Servers without using cluster mode and Redis Sentinel.
- Ring.
- Instrumentation.
- Cache friendly.
- Rate limiting.
- Distributed Locks.
Installation
Install:
go get -u github.com/nexsoftgit/go-redis
Import:
import "github.com/nexsoftgit/go-redis"
Quickstart
func ExampleNewClient() {
opts := &redis.Options{
CircuitBreaker: optCB,
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
}
client := redis.NewClient(opts)
pong, err := client.Ping().Result()
fmt.Println(pong, err)
// Output: PONG <nil>
}
With Circuit Breaker
func WithCircuitBreaker() {
optCB := &hystrix.CommandConfig{
Timeout: 10000,
RequestVolumeThreshold: 2,
SleepWindow: 500,
ErrorPercentThreshold: 5,
}
// Please, read more about command config in hystrix-go doc.
//https://godoc.org/github.com/afex/hystrix-go/hystrix#pkg-variables)
opts := &redis.Options{
CircuitBreaker: optCB,
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
}
client := redis.NewClient(opts)
pong, err := client.Ping().Result()
fmt.Println(pong, err)
// Output: PONG <nil>
}
Any changes in breaker state will generate metrics for monitoring. Below is a list of the metrics.
Name: "circuit_breaker"
Help: "A total number of redis client make a request to redis server with circuit breaker state."
Labels:
- command : "redis command"
- service : "service name"
- status : "fail/ok"
- state:
- "circuit breaker open": A total number of circuit breaker state open. This happens due to the circuit being measured as unhealthy.
- "max_concurency": A total number of client executed at the same time and exceeded max concurrency.
- "timeout": A total number of request exceeded timeout duration
Howto
Please go through examples to get an idea how to use this package.
Look and feel
Some corner cases:
SET key value EX 10 NX
set, err := client.SetNX("key", "value", 10*time.Second).Result()
SORT list LIMIT 0 2 ASC
vals, err := client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result()
ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2
vals, err := client.ZRangeByScoreWithScores("zset", redis.ZRangeBy{
Min: "-inf",
Max: "+inf",
Offset: 0,
Count: 2,
}).Result()
ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM
vals, err := client.ZInterStore("out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2").Result()
EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello"
vals, err := client.Eval("return {KEYS[1],ARGV[1]}", []string{"key"}, "hello").Result()
Benchmark
go-redis vs redigo:
BenchmarkSetGoRedis10Conns64Bytes-4 200000 7621 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis100Conns64Bytes-4 200000 7554 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis10Conns1KB-4 200000 7697 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis100Conns1KB-4 200000 7688 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis10Conns10KB-4 200000 9214 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis100Conns10KB-4 200000 9181 ns/op 210 B/op 6 allocs/op
BenchmarkSetGoRedis10Conns1MB-4 2000 583242 ns/op 2337 B/op 6 allocs/op
BenchmarkSetGoRedis100Conns1MB-4 2000 583089 ns/op 2338 B/op 6 allocs/op
BenchmarkSetRedigo10Conns64Bytes-4 200000 7576 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo100Conns64Bytes-4 200000 7782 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo10Conns1KB-4 200000 7958 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo100Conns1KB-4 200000 7725 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo10Conns10KB-4 100000 18442 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo100Conns10KB-4 100000 18818 ns/op 208 B/op 7 allocs/op
BenchmarkSetRedigo10Conns1MB-4 2000 668829 ns/op 226 B/op 7 allocs/op
BenchmarkSetRedigo100Conns1MB-4 2000 679542 ns/op 226 B/op 7 allocs/op
Redis Cluster:
BenchmarkRedisPing-4 200000 6983 ns/op 116 B/op 4 allocs/op
BenchmarkRedisClusterPing-4 100000 11535 ns/op 117 B/op 4 allocs/op
See also
# Functions
No description provided by the author
NewBoolResult returns a BoolCmd initialised with val and err for testing.
No description provided by the author
NewBoolSliceResult returns a BoolSliceCmd initialised with val and err for testing.
NewClient returns a client to the Redis Server specified by Options.
NewClusterClient returns a Redis Cluster client as described in http://redis.io/topics/cluster-spec.
No description provided by the author
NewClusterSlotsCmdResult returns a ClusterSlotsCmd initialised with val and err for testing.
No description provided by the author
NewCmdResult returns a Cmd initialised with val and err for testing.
No description provided by the author
NewCommandsInfoCmdResult returns a CommandsInfoCmd initialised with val and err for testing.
No description provided by the author
NewDurationResult returns a DurationCmd initialised with val and err for testing.
NewFailoverClient returns a Redis client that uses Redis Sentinel for automatic failover.
No description provided by the author
NewFloatResult returns a FloatCmd initialised with val and err for testing.
No description provided by the author
NewGeoLocationCmdResult returns a GeoLocationCmd initialised with val and err for testing.
No description provided by the author
No description provided by the author
NewIntResult returns an IntCmd initialised with val and err for testing.
No description provided by the author
No description provided by the author
NewScanCmdResult returns a ScanCmd initialised with val and err for testing.
No description provided by the author
No description provided by the author
No description provided by the author
NewSliceResult returns a SliceCmd initialised with val and err for testing.
No description provided by the author
NewStatusResult returns a StatusCmd initialised with val and err for testing.
No description provided by the author
No description provided by the author
NewStringIntMapCmdResult returns a StringIntMapCmd initialised with val and err for testing.
NewStringResult returns a StringCmd initialised with val and err for testing.
No description provided by the author
NewStringSliceResult returns a StringSliceCmd initialised with val and err for testing.
No description provided by the author
NewStringStringMapResult returns a StringStringMapCmd initialised with val and err for testing.
No description provided by the author
No description provided by the author
NewUniversalClient returns a new multi client.
No description provided by the author
No description provided by the author
No description provided by the author
NewZSliceCmdResult returns a ZSliceCmd initialised with val and err for testing.
ParseURL parses an URL into Options that can be used to connect to Redis.
No description provided by the author
# Constants
Nil reply Redis returns when key does not exist.
TxFailedErr transaction redis failed.
# Structs
No description provided by the author
No description provided by the author
No description provided by the author
Client is a Redis client representing a pool of zero or more underlying connections.
ClusterClient is a Redis Cluster client representing a pool of zero or more underlying connections.
No description provided by the author
ClusterOptions are used to configure a cluster client and should be passed to NewClusterClient.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
Conn is like Client, but its pool contains single connection.
No description provided by the author
FailoverOptions are used to configure a failover client and should be passed to NewFailoverClient.
No description provided by the author
GeoLocation is used with GeoAdd to add geospatial location.
No description provided by the author
No description provided by the author
No description provided by the author
GeoRadiusQuery is used with GeoRadius to query geospatial index.
No description provided by the author
Message received as result of a PUBLISH command issued by another client.
No description provided by the author
Pipeline implements pipelining as described in http://redis.io/topics/pipelining.
Pong received as result of a PING command issued by another client.
PubSub implements Pub/Sub commands as described in http://redis.io/topics/pubsub.
Ring is a Redis client that uses constistent hashing to distribute keys across multiple Redis servers (shards).
RingOptions are used to configure a ring client and should be passed to NewRing.
No description provided by the author
ScanIterator is used to incrementally iterate over a collection of elements.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
Subscription received after a successful subscription to channel.
No description provided by the author
Tx implements Redis transactions as described in http://redis.io/topics/transactions.
UniversalOptions information is required by UniversalClient to establish connections.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
Z represents sorted set member.
No description provided by the author
No description provided by the author
ZStore is used as an arg to ZInterStore and ZUnionStore.
# Interfaces
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
UniversalClient is an abstract client which - based on the provided options - can connect to either clusters, or sentinel-backed failover instances or simple single-instance servers.
# Type aliases
No description provided by the author