Go操作Redis

Redis简介

Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

Redis安装

CentOS7安装

1yum -y install epel-release
2yum -y install redis

CentOS8安装

1dnf -y install redis

运行redis

默认监听在127.0.0.1:6379

1sed -i '/^bind/s@127.0.0.1@0.0.0.0@' /etc/redis.conf
2systemctl enable --now redis

安装go-redis

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

简单示例

Get/Set示例

 1package main
 2
 3import (
 4	"log"
 5
 6	"github.com/go-redis/redis/v7"
 7)
 8
 9func main() {
10	client := redis.NewClient(&redis.Options{
11		Addr:     "172.16.10.10:6379",
12		Password: "", // no password set
13		DB:       0,  // use default DB
14	})
15
16	_, err := client.Ping().Result()
17	if err != nil {
18		log.Printf("redis连接失败,错误信息:%v\n", err)
19		return
20	}
21	log.Println("redis连接成功")
22
23	// Set
24	err = client.Set("name", "jerry", 0).Err()
25	if err != nil {
26		panic(err)
27	}
28
29	// Get
30	str := client.Get("name")
31	log.Println(str)
32}

运行结果

1go run main.go
22020/03/13 21:11:46 redis连接成功
32020/03/13 21:11:46 get name: jerry

连接哨兵模式

 1package main
 2
 3import (
 4	"github.com/go-redis/redis/v7"
 5)
 6
 7func main() {
 8	rdb := redis.NewFailoverClient(&redis.FailoverOptions{
 9		MasterName:    "master",
10		SentinelAddrs: []string{":26379"},
11	})
12	rdb.Ping()
13}

集群模式

 1package main
 2
 3import (
 4	"github.com/go-redis/redis/v7"
 5)
 6
 7func main() {
 8	rdb := redis.NewClusterClient(&redis.ClusterOptions{
 9		Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
10	})
11	rdb.Ping()
12}

发布订阅

通常用作消息队列

 1package main
 2
 3import (
 4	"log"
 5	"time"
 6
 7	"github.com/go-redis/redis/v7"
 8)
 9
10func main() {
11	client := redis.NewClient(&redis.Options{
12		Addr:     "172.16.10.10:6379",
13		Password: "", // no password set
14		DB:       0,  // use default DB
15	})
16
17	_, err := client.Ping().Result()
18	if err != nil {
19		log.Printf("redis连接失败,错误信息:%v\n", err)
20		return
21	}
22	log.Println("redis连接成功")
23
24	// 发布订阅
25	pubsub := client.Subscribe("channel1")
26
27	// 发布前先订阅
28	_, err = pubsub.Receive()
29	if err != nil {
30		panic(err)
31	}
32
33	// Go channel接收信息
34	ch := pubsub.Channel()
35
36	// 发布消息
37	err = client.Publish("channel1", "hello").Err()
38	if err != nil {
39		panic(err)
40	}
41
42	time.AfterFunc(time.Second, func() {
43		// 订阅和通道都关闭
44		_ = pubsub.Close()
45	})
46
47	// 消费
48	for msg := range ch {
49		log.Println(msg.Channel, msg.Payload)
50	}
51
52}

运行结果

12020/03/13 22:56:47 redis连接成功
22020/03/13 22:56:47 channel1 hello