Type-safe Redis client for Golang
Latest commit fa76dd0 Oct 14, 2018
Permalink
Failed to load latest commit information.
internal Add releaseConnStrict Oct 14, 2018
testdata Added backoff retry May 26, 2017
.gitignore Use go standard path for test data Mar 12, 2016
.travis.yml travis: test on Go 1.11 Sep 7, 2018
CHANGELOG.md Process pipeline commands concurrently Sep 11, 2018
LICENSE Fix license. Sep 12, 2016
Makefile Fix build on 32bit arch Mar 7, 2018
README.md Code highlighting for example codes Jul 20, 2018
bench_test.go Bench bigget values Aug 15, 2018
cluster.go Add releaseConnStrict Oct 14, 2018
cluster_commands.go Add Cluster.DBSize Sep 11, 2017
cluster_test.go remove snake case use Oct 11, 2018
command.go Fix typo Aug 27, 2018
command_test.go Add FlushDBAsync and FlushAllAsync Jun 17, 2017
commands.go Set cmd timeout when Block >= 0 Sep 13, 2018
commands_test.go remove redundant type declaration Oct 11, 2018
doc.go doc: fix outdated reference. Oct 7, 2014
example_instrumentation_test.go Replace client with redisdb in examples Aug 12, 2018
example_test.go use more idiomatic for loop in ExamplePubSub Oct 3, 2018
export_test.go Rework ReceiveMessage Jul 23, 2018
internal_test.go Add missing options to UniversalOptions Aug 15, 2018
iterator.go Remove Scanner in favor of ScanCmd. Jan 3, 2017
iterator_test.go Add FlushDBAsync and FlushAllAsync Jun 17, 2017
main_test.go Optimize reading big values Aug 16, 2018
options.go Add test for read timeout option (#877) Oct 5, 2018
options_test.go Add test for read timeout option (#877) Oct 5, 2018
pipeline.go Add more docs for Tx Jul 12, 2018
pipeline_test.go Add FlushDBAsync and FlushAllAsync Jun 17, 2017
pool_test.go Add MaxConnAge Aug 12, 2018
pubsub.go Fix nil ping error Oct 9, 2018
pubsub_test.go Add MaxConnAge Aug 12, 2018
race_test.go Add more race tests May 17, 2018
redis.go Add releaseConnStrict Oct 14, 2018
redis_test.go Cleanup pool May 29, 2018
result.go Optimize reading big values Aug 16, 2018
ring.go Add releaseConnStrict Oct 14, 2018
ring_test.go Rework ReceiveMessage Jul 23, 2018
script.go Script: Fix `Exists` to use hash instead of source (#726) Mar 5, 2018
sentinel.go Copy TLSConfig to SentinelClient options Oct 10, 2018
sentinel_test.go Resent client pool when sentinel switches master Jun 29, 2017
tx.go Add more docs for Tx Jul 12, 2018
tx_test.go Cleanup pool May 29, 2018
universal.go Add missing options to UniversalOptions Aug 15, 2018
universal_test.go Update import Feb 20, 2017

README.md

Redis client for Golang

Build Status GoDoc Airbrake

Supports:

API docs: https://godoc.org/github.com/go-redis/redis. Examples: https://godoc.org/github.com/go-redis/redis#pkg-examples.

Installation

Install:

go get -u github.com/go-redis/redis

Import:

import "github.com/go-redis/redis"

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 exist")
	} else if err != nil {
		panic(err)
	} else {
		fmt.Println("key2", val2)
	}
	// Output: key value
	// key2 does not exist
}

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