forked from mirror/redis
4f70db6849
This makes the reading and writing of lastDialError from the pool faster, as atomic.Value is much more lightweight than the mutex. Note that using error in atomic.Value directly could cause panics, because errors could have inconsistent types. Thus wrap them with a simple struct. |
||
---|---|---|
internal | ||
redisext | ||
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 | ||
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
Sponsors
Ecosystem
Features
- 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.
API docs: https://pkg.go.dev/github.com/go-redis/redis/v8?tab=doc. Examples: https://pkg.go.dev/github.com/go-redis/redis/v8?tab=doc#pkg-examples.
Installation
go-redis requires a Go version with Modules support and uses import versioning. So please make sure to initialize a Go module before installing go-redis:
go mod init github.com/my/repo
go get github.com/go-redis/redis/v8
Import:
import "github.com/go-redis/redis/v8"
Quickstart
import (
"context"
"github.com/go-redis/redis/v8"
)
var ctx = context.Background()
func ExampleNewClient() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pong, err := rdb.Ping(ctx).Result()
fmt.Println(pong, err)
// Output: PONG <nil>
}
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
}
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 := rdb.SetNX(ctx, "key", "value", 10*time.Second).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()