go操作redis

go操作redis

参考

导入依赖

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

创建客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)

var (
rdb *redis.Client // redis客户端
ctx = context.Background() // 上下文
)

func init() {
// 创建redis客户端
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
}

func main() {
result, err := rdb.Ping(ctx).Result()
checkErr(err)
fmt.Println(result) // PONG
}

func checkErr(err error) {
if err != nil {
fmt.Println(err)
return
}
}

基本操作

获取所有keykeys()

1
2
3
4
5
func main() {
keys, err := rdb.Keys(ctx, "*").Result()
checkErr(err)
fmt.Println(keys)
}

获取key对应值的类型Type()

1
2
3
4
5
func main() {
res, err := rdb.Type(ctx, "aaa").Result()
checkErr(err)
fmt.Println(res)
}

超时时间

1
2
3
4
5
6
7
8
9
10
11
func main() {
// 设置超时时间
res, err := rdb.Expire(ctx, "aaa", time.Hour).Result()
checkErr(err)
fmt.Println(res)

// 获取超时时间
res, err := rdb.TTL(ctx, "aaa").Result()
checkErr(err)
fmt.Println(res) // 57m18s
}

设置值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main() {
// string
res, err := rdb.Set(ctx, "aaa", "bbb", time.Hour).Result()
checkErr(err)
fmt.Println(res) // OK

// 不存在才设置值
res, err := rdb.SetNX(ctx, "aaa", "ccc", time.Hour).Result()
checkErr(err)
fmt.Println(res) // false

// 递增递减
rdb.SetNX(ctx, "key", 1, time.Hour)
val, err := rdb.Incr(ctx, "key").Result()
val, err := rdb.Decr(ctx, "key").Result()

// hash 基本上在前面加个H
// list LPush/RPop...
// set SAdd/SRem/SisMember...
// sorted set ZAdd/ZRem/ZScore/ZRank...
}

获取值

1
2
3
4
5
6
func main() {
// string
res, err := rdb.Get(ctx, "aaa").Result()
checkErr(err)
fmt.Println(res) // bbb
}

删除值

1
2
3
4
5
6
func main() {
// 一个或多个
res, err := rdb.Del(ctx, "aaa").Result()
checkErr(err)
fmt.Println(res) // 1
}

Redis作为消息队列

发送消息到队列

1
2
3
func main() {
rdb.Publish(ctx, "channel1", "message")
}

订阅主题来接收消息

1
2
3
4
5
6
7
8
9
func main() {
// PSubscribe 支持模式匹配的订阅主题
sub := rdb.Subscribe(ctx, "channel1")

for msg := range sub.Channel() {
// 打印收到的消息
fmt.Println(msg.Channel, msg.Payload)
}
}

事务

通过pipeline实现

pipeline是Redis提供的一种批量执行命令的机制。它可以将多个命令一次性发送给Redis服务器执行,减少了网络通信的开销,提高了性能。

使用Pipeline可以在客户端批量发送多个命令,而不需要等待每个命令的响应。这样可以减少网络延迟和服务器响应时间,特别适用于需要执行大量命令的场景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
// 开启一个TxPipeline事务
pipe := rdb.TxPipeline()

// 执行事务操作,可以通过pipe读写redis
incr := pipe.Incr(ctx,"tx_pipeline_counter")
pipe.Expire(ctx,"tx_pipeline_counter", time.Hour)

// 上面代码等同于执行下面redis命令
//
// MULTI
// INCR pipeline_counter
// EXPIRE pipeline_counts 3600
// EXEC

// 通过Exec函数提交redis事务
_, err := pipe.Exec(ctx)

// 提交事务后,我们可以查询事务操作的结果
// 前面执行Incr函数,在没有执行exec函数之前,实际上还没开始运行。
fmt.Println(incr.Val(), err)
}

go操作redis
http://xwww12.github.io/2023/11/06/go/go操作redis/
作者
xw
发布于
2023年11月6日
许可协议