Type-safe Redis client for Golang
Go to file
Artem Chernyshev 03da66c18a Add new parameter to the RingOptions to override CommandInfo first key
There is problem with `eval` and `evalsha` commands.
`COMMAND INFO eval` returns first key position equals `0`.
After that, redis ring chooses `eval` as a value for sharding.
They, if you try to delete created value, ring may choose another shard
and delete won't work.

Eval command should be parsed, to be sharded properly, according to
redis specs: http://redis.io/commands/command .

I've introduced a new flag in the `RingOptions`, which will enable new
behavior: `EnableKeyLocationParsing`.

If it is enabled, `cmdFirstKey` will try to get key position using
`cmd.getFirstKeyPos()`. This function is defined for `eval` and
`evalsha` commands.
If it has parameters, it will return `3`, otherwise it will return `0`.
2016-10-04 17:09:04 +03:00
internal Enable reaper on ClusterClient and add tests. 2016-10-02 12:44:01 +00:00
testdata Use go standard path for test data 2016-03-12 10:25:59 +00:00
.gitignore Use go standard path for test data 2016-03-12 10:25:59 +00:00
.travis.yml Try to fix Go 1.4. 2016-09-14 11:00:34 +00:00
LICENSE Fix license. 2016-09-12 12:00:28 +00:00
Makefile Extract race tests to separate file. Add more race tests. 2016-03-16 19:45:35 +02:00
README.md Update README.md to use redis.v4 documentation 2016-05-25 11:32:13 -06:00
bench_test.go Use redis.v4 that is in alpha/beta state. 2016-04-09 13:27:16 +03:00
cluster.go Enable reaper on ClusterClient and add tests. 2016-10-02 12:44:01 +00:00
cluster_client_test.go Add latency based routing to Redis Cluster client. 2016-05-23 12:49:55 +03:00
cluster_test.go Enable reaper on ClusterClient and add tests. 2016-10-02 12:44:01 +00:00
command.go Rename GeoPosition to GeoPos for consistency with Redis Server. Simplify code where possible. 2016-08-22 09:39:22 +00:00
command_test.go Add latency based routing to Redis Cluster client. 2016-05-23 12:49:55 +03:00
commands.go Add Pipeline to Cmdable. 2016-09-27 09:29:21 +00:00
commands_test.go Enable reaper on ClusterClient and add tests. 2016-10-02 12:44:01 +00:00
doc.go doc: fix outdated reference. 2014-10-07 09:27:55 +03:00
example_test.go Tweak transaction API. 2016-05-02 15:54:15 +03:00
export_test.go Move logger to internal package. 2016-04-09 14:52:01 +03:00
iterator.go fix comments 2016-09-08 16:40:45 +03:00
iterator_test.go fix iterator across empty pages 2016-09-08 16:07:49 +03:00
main_test.go Add new parameter to the RingOptions to override CommandInfo first key 2016-10-04 17:09:04 +03:00
options.go Disable idle checks for cluster connection 2016-09-27 14:13:33 +09:00
parser.go Rename GeoPosition to GeoPos for consistency with Redis Server. Simplify code where possible. 2016-08-22 09:39:22 +00:00
pipeline.go Make proto/parser an internal package 2016-07-02 13:52:10 +01:00
pipeline_test.go Make proto/parser an internal package 2016-07-02 13:52:10 +01:00
pool_test.go Enable reaper on ClusterClient and add tests. 2016-10-02 12:44:01 +00:00
pubsub.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00
pubsub_test.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00
race_test.go Make readLine more strict. 2016-06-27 09:54:22 +00:00
redis.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00
redis_test.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00
result.go Add Cmd constructors for testing/mock purposes. 2016-08-22 21:20:49 +01:00
ring.go Add new parameter to the RingOptions to override CommandInfo first key 2016-10-04 17:09:04 +03:00
ring_test.go Add new parameter to the RingOptions to override CommandInfo first key 2016-10-04 17:09:04 +03:00
script.go Accept interface{} in Eval. Fixes #243. 2016-04-09 11:01:33 +03:00
sentinel.go Rework Options initialisation. 2016-06-05 11:10:30 +00:00
sentinel_test.go Use redis.v4 that is in alpha/beta state. 2016-04-09 13:27:16 +03:00
tx.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00
tx_test.go Simplify resubscribing in PubSub. 2016-09-29 12:33:47 +00:00

README.md

Redis client for Golang Build Status

Supports:

API docs: http://godoc.org/gopkg.in/redis.v4. Examples: http://godoc.org/gopkg.in/redis.v4#pkg-examples.

Installation

Install:

go get gopkg.in/redis.v4

Quickstart

func ExampleNewClient() {
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})

	pong, err := client.Ping().Result()
	fmt.Println(pong, err)
	// Output: PONG <nil>
}

func ExampleClient() {
	err := client.Set("key", "value", 0).Err()
	if err != nil {
		panic(err)
	}

	val, err := client.Get("key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("key", val)

	val2, err := client.Get("key2").Result()
	if err == redis.Nil {
		fmt.Println("key2 does not exists")
	} else if err != nil {
		panic(err)
	} else {
		fmt.Println("key2", val2)
	}
	// Output: key value
	// key2 does not exists
}

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.ZRangeByScore{
    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"}, []string{"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

Shameless plug

Check my PostgreSQL client for Go.