You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6543
fae07cbc8f
|
3 years ago | |
---|---|---|
.. | ||
internal | 3 years ago | |
.gitignore | 4 years ago | |
.golangci.yml | 4 years ago | |
.prettierrc | 4 years ago | |
CHANGELOG.md | 3 years ago | |
LICENSE | 4 years ago | |
Makefile | 4 years ago | |
README.md | 3 years ago | |
cluster.go | 3 years ago | |
cluster_commands.go | 3 years ago | |
command.go | 3 years ago | |
commands.go | 3 years ago | |
doc.go | 4 years ago | |
error.go | 3 years ago | |
go.mod | 3 years ago | |
go.sum | 3 years ago | |
iterator.go | 4 years ago | |
options.go | 3 years ago | |
pipeline.go | 4 years ago | |
pubsub.go | 3 years ago | |
redis.go | 3 years ago | |
result.go | 4 years ago | |
ring.go | 4 years ago | |
script.go | 4 years ago | |
sentinel.go | 3 years ago | |
tx.go | 4 years ago | |
universal.go | 4 years ago |
README.md
Redis client for Golang
- Join Discord to ask questions.
- Documentation
- Reference
- Examples
- RealWorld example app
My other projects:
- Bun - fast and simple SQL client for PostgreSQL, MySQL, and SQLite.
- treemux - high-speed, flexible, tree-based HTTP router for Go.
Ecosystem
Features
- Redis 3 commands except QUIT, MONITOR, 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.
Installation
go-redis supports 2 last Go versions and requires a Go version with modules support. So make sure to initialize a Go module:
go mod init github.com/my/repo
And then install go-redis/v8 (note v8 in the import; omitting it is a popular mistake):
go get github.com/go-redis/redis/v8
Quickstart
import (
"context"
"github.com/go-redis/redis/v8"
)
var ctx = context.Background()
func ExampleClient() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key", val)
val2, err := rdb.Get(ctx, "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
}
Look and feel
Some corner cases:
// SET key value EX 10 NX
set, err := rdb.SetNX(ctx, "key", "value", 10*time.Second).Result()
// SET key value keepttl NX
set, err := rdb.SetNX(ctx, "key", "value", redis.KeepTTL).Result()
// SORT list LIMIT 0 2 ASC
vals, err := rdb.Sort(ctx, "list", &redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result()
// ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2
vals, err := rdb.ZRangeByScoreWithScores(ctx, "zset", &redis.ZRangeBy{
Min: "-inf",
Max: "+inf",
Offset: 0,
Count: 2,
}).Result()
// ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM
vals, err := rdb.ZInterStore(ctx, "out", &redis.ZStore{
Keys: []string{"zset1", "zset2"},
Weights: []int64{2, 3}
}).Result()
// EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello"
vals, err := rdb.Eval(ctx, "return {KEYS[1],ARGV[1]}", []string{"key"}, "hello").Result()
// custom command
res, err := rdb.Do(ctx, "set", "key", "value").Result()
Run the test
go-redis will start a redis-server and run the test cases.
The paths of redis-server bin file and redis config file are defined in main_test.go
:
var (
redisServerBin, _ = filepath.Abs(filepath.Join("testdata", "redis", "src", "redis-server"))
redisServerConf, _ = filepath.Abs(filepath.Join("testdata", "redis", "redis.conf"))
)
For local testing, you can change the variables to refer to your local files, or create a soft link
to the corresponding folder for redis-server and copy the config file to testdata/redis/
:
ln -s /usr/bin/redis-server ./go-redis/testdata/redis/src
cp ./go-redis/testdata/redis.conf ./go-redis/testdata/redis/
Lastly, run:
go test