Type-safe Redis client for Golang
Go to file
Yuxuan 'fishy' Wang 4f70db6849 Use atomic.Value instead of lock for ConnPool.lastDialError
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.
2020-07-14 11:25:59 -07:00
internal Use atomic.Value instead of lock for ConnPool.lastDialError 2020-07-14 11:25:59 -07:00
redisext RecordError in OpenTelemetryHook 2020-07-09 12:23:03 +03:00
testdata Added backoff retry 2017-05-26 14:33:34 +03:00
.gitignore Use go standard path for test data 2016-03-12 10:25:59 +00:00
.golangci.yml Bump golangci-lint to v1.21.0 2019-11-18 18:46:13 +01:00
.prettierrc Add sponsors 2020-06-09 17:59:23 +03:00
.travis.yml Use Redis stable for testing 2020-06-05 09:08:16 +03:00
CHANGELOG.md Cleanup 2020-06-10 15:04:12 +03:00
LICENSE Fix license. 2016-09-12 12:00:28 +00:00
Makefile Use Redis stable for testing 2020-06-05 09:08:16 +03:00
README.md Add ctx declaration in readme 2020-06-14 12:45:37 +02:00
bench_test.go Bump major version 2020-05-19 08:52:38 +03:00
cluster.go Rename clusterAddrs to activeAddrs 2020-07-09 11:35:19 +03:00
cluster_commands.go Add ctx as first arg 2020-05-19 08:52:38 +03:00
cluster_test.go Cleanup 2020-06-10 15:04:12 +03:00
command.go Merge pull request #1400 from alonana/master 2020-07-09 11:56:30 +03:00
command_test.go Merge branch 'v8' 2020-05-21 10:16:44 +03:00
commands.go Cleanup appendArgs 2020-06-29 17:48:57 +03:00
commands_test.go add support for slices in XAddArgs.Values 2020-06-28 12:36:22 +02:00
doc.go doc: fix outdated reference. 2014-10-07 09:27:55 +03:00
error.go Merge branch 'v8' 2020-05-21 10:16:44 +03:00
example_instrumentation_test.go Bump major version 2020-05-19 08:52:38 +03:00
example_test.go Cleanup 2020-06-10 15:04:12 +03:00
export_test.go Bump major version 2020-05-19 08:52:38 +03:00
go.mod upgrade xxhash to v2 2020-07-06 13:51:51 +09:00
go.sum upgrade xxhash to v2 2020-07-06 13:51:51 +09:00
internal_test.go Fix build 2020-05-21 10:03:09 +03:00
iterator.go Add ctx as first arg 2020-05-19 08:52:38 +03:00
iterator_test.go Bump major version 2020-05-19 08:52:38 +03:00
main_test.go Bump major version 2020-05-19 08:52:38 +03:00
options.go Set Ring.Username 2020-06-12 09:28:14 +03:00
options_test.go Add AuthACL 2020-05-21 08:59:51 +03:00
pipeline.go Bump major version 2020-05-19 08:52:38 +03:00
pipeline_test.go Bump major version 2020-05-19 08:52:38 +03:00
pool_test.go Bump major version 2020-05-19 08:52:38 +03:00
pubsub.go Merge branch 'v8' 2020-05-21 10:16:44 +03:00
pubsub_test.go Bump major version 2020-05-19 08:52:38 +03:00
race_test.go Fix build 2020-06-05 09:55:37 +03:00
redis.go Add OnConnect context 2020-06-10 10:36:22 +03:00
redis_test.go Add OnConnect context 2020-06-10 10:36:22 +03:00
result.go add NewTimeCmdResult to allow unit testing with TimeCmd (#1298) 2020-04-18 09:05:16 +03:00
ring.go upgrade xxhash to v2 2020-07-06 13:51:51 +09:00
ring_test.go Use Rendezvous in Ring. Thanks @rafaeleyng for initial idea and implementation 2020-06-08 13:22:37 +03:00
script.go Add ctx as first arg 2020-05-19 08:52:38 +03:00
sentinel.go Add OnConnect context 2020-06-10 10:36:22 +03:00
sentinel_test.go Bump major version 2020-05-19 08:52:38 +03:00
tx.go Bump major version 2020-05-19 08:52:38 +03:00
tx_test.go Bump major version 2020-05-19 08:52:38 +03:00
universal.go Add OnConnect context 2020-06-10 10:36:22 +03:00
universal_test.go Bump major version 2020-05-19 08:52:38 +03:00

README.md

Redis client for Golang

Build Status GoDoc

Sponsors

Ecosystem

Features

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()

See also