mirror of https://github.com/go-redis/redis.git
cc71f5d293 | ||
---|---|---|
.github/ISSUE_TEMPLATE | ||
example/otel | ||
extra | ||
internal | ||
testdata | ||
.gitignore | ||
.golangci.yml | ||
.prettierrc | ||
.travis.yml | ||
CHANGELOG.md | ||
LICENSE | ||
Makefile | ||
README.md | ||
bench_test.go | ||
cluster.go | ||
cluster_commands.go | ||
cluster_test.go | ||
command.go | ||
command_test.go | ||
commands.go | ||
commands_test.go | ||
doc.go | ||
error.go | ||
example_instrumentation_test.go | ||
example_test.go | ||
export_test.go | ||
go.mod | ||
go.sum | ||
internal_test.go | ||
iterator.go | ||
iterator_test.go | ||
main_test.go | ||
options.go | ||
options_test.go | ||
pipeline.go | ||
pipeline_test.go | ||
pool_test.go | ||
pubsub.go | ||
pubsub_test.go | ||
race_test.go | ||
redis.go | ||
redis_test.go | ||
renovate.json | ||
result.go | ||
ring.go | ||
ring_test.go | ||
script.go | ||
sentinel.go | ||
sentinel_test.go | ||
tx.go | ||
tx_test.go | ||
universal.go | ||
universal_test.go |
README.md
Redis client for Golang
❤️ Uptrace.dev - distributed traces, logs, and errors in one place
- Join Discord to ask questions.
- Documentation
- Reference
- Examples
- RealWorld example app
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 (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()