引入

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

基础使用

连接

基于配置的连接

1
2
3
4
5
rdb := redis.NewClient(&redis.Options{
	Addr:	  "localhost:6379",
	Password: "", // 没有密码,默认值
	DB:		  0,  // 默认DB 0
})

基于URL的连接

1
2
3
4
5
6
opt, err := redis.ParseURL("redis://<user>:<pass>@localhost:6379/<db>")
if err != nil {
	panic(err)
}

rdb := redis.NewClient(opt)

配置TLS

1
2
3
4
5
6
rdb := redis.NewClient(&redis.Options{
	TLSConfig: &tls.Config{
		MinVersion: tls.VersionTLS12,
		ServerName: "你的域名",
	},
})

基于SSH

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
sshConfig := &ssh.ClientConfig{
	User:			 "root",
	Auth:			 []ssh.AuthMethod{ssh.Password("password")},
	HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	Timeout:		 15 * time.Second,
}

sshClient, err := ssh.Dial("tcp", "remoteIP:22", sshConfig)
if err != nil {
	panic(err)
}

rdb := redis.NewClient(&redis.Options{
	Addr: net.JoinHostPort("127.0.0.1", "6379"),
	Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
		return sshClient.Dial(network, addr)
	},
	// SSH不支持超时设置,在这里禁用
	ReadTimeout:  -1,
	WriteTimeout: -1,
})

上下文

go-redis支持Context,可以使用它控制超时或者传递一些数据,也可以监控go-redis性能。

1
ctx := context.Background()

执行基本命令

1
2
3
4
5
val, err := rdb.Get(ctx, "key").Result()
fmt.Println(val)

get := rdb.Get(ctx, "key")
fmt.Println(get.Val(), get.Err())

使用CMD命令

1
2
3
4
5
6
7
8
9
val, err := rdb.Do(ctx, "get", "key").Result()
if err != nil {
	if err == redis.Nil {
		fmt.Println("key does not exists")
		return
	}
	panic(err)
}
fmt.Println(val.(string))

返回值是CMD类型,可以获取指定类型

1
2
3
// Text is a shortcut for get.Val().(string) with proper error handling.
val, err := rdb.Do(ctx, "get", "key").Text()
fmt.Println(val, err)

方法列表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
s, err := cmd.Text()
flag, err := cmd.Bool()

num, err := cmd.Int()
num, err := cmd.Int64()
num, err := cmd.Uint64()
num, err := cmd.Float32()
num, err := cmd.Float64()

ss, err := cmd.StringSlice()
ns, err := cmd.Int64Slice()
ns, err := cmd.Uint64Slice()
fs, err := cmd.Float32Slice()
fs, err := cmd.Float64Slice()
bs, err := cmd.BoolSlice()

redis.Nil

redis.Nil并非错误,而是一种状态,如表示数据不存在

1
2
3
4
5
6
7
8
9
val, err := rdb.Get(ctx, "key").Result()
switch {
case err == redis.Nil:
	fmt.Println("key不存在")
case err != nil:
	fmt.Println("错误", err)
case val == "":
	fmt.Println("值是空字符串")
}

Conn

从连接池初中取出单个链接,使用完毕后应该释放

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cn := rdb.Conn(ctx)
defer cn.Close()

if err := cn.ClientSetName(ctx, "myclient").Err(); err != nil {
	panic(err)
}

name, err := cn.ClientGetName(ctx).Result()
if err != nil {
	panic(err)
}
fmt.Println("client name", name)