Go语言玩转Redis (一):聊聊 Redis 的学习体系

Redis 是一个开源内存数据结构存储器,经常用作数据库、缓存以及消息代理等。为什么要写一个Go使用的Redis的专题呢?因为Redis 我们平时经常用,但很多时候使用姿势不对,或是突然忘记某种场景该如何使用Redis实现。当需要程序快速响应的时候使用Redis做数据存储获取是不二的选择,这个专题就是想记录下Redis的框架体系,使用方式,场景,正确使用姿势等,便于之后的查询及逻辑构建

这个专题主要是基于 黄建宏老师的 《Redis 使用手册》一书,基于该书的讲解框架,结合Go语言的调用代码实例,及我自己的一些使用场景积累及说明写下。

Redis 的学习框架及特色

redis_struct

学习框架

数据结构与应用

Redis核心的9种数据结构,列举了操作这些数据结构的众多命令及其详细信息,融合 Golang 调用 Redis命令构建应用示例。通过这些示例,进行场景经验的积累。

附加功能

Redis在数据结构的基础上为用户提供的额外功能,包括管理数据结构的数据库管理功能和自动过期功能,将数据结构持久化至硬盘从而避免数据丢失的持久化功能,提高多条命令执行效率的流水线功能,保证命令安全性的事务和Lua脚本功能,以及扩展服务器特性的模块功能等。这些功能在为用户提供方便的同时,也进一步扩大了Redis的适用范围,拓展Redis使用场景。

多机功能

介绍了Redis的3项多机功能,分别是复制、Sentinel和集群。其中复制用于创建多个Redis服务器的副本,并借此提升整个Redis系统的读性能以及容灾能力。Sentinel在复制的基础上,为Redis系统提供了自动的故障转移功能,从而使整个系统可以更健壮地运行。最后,通过使用Redis集群,用户可以在线扩展Redis系统的读写能力。通过这部分来获得扩展Redis读写性能的相关知识,并根据自己的情况为Redis系统选择合适的扩展方式。

特色

结构丰富

Redis为用户提供了字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等一系列丰富的数据结构,每种数据结构都适用于解决特定的问题。在有需要的时候,用户还可以通过事务、Lua脚本、模块等特性,扩展已有数据结构的功能,甚至从零实现自己专属的数据结构。通过这些数据结构和特性,Redis能够确保用户可以使用适合的工具去解决问题。

功能完备

在上述数据结构的基础上,Redis提供了很多非常实用的附加功能,比如自动过期、流水线、事务、数据持久化等,这些功能能够帮助用户将Redis应用在更多不同的场景中,或者为用户带来便利。更重要的是,Redis不仅可以单机使用,还可以多机使用:通过Redis自带的复制、Sentinel和集群功能,用户可以将自己的数据库扩展至任意大小。无论你运营的是一个小型的个人网站,还是一个为上千万消费者服务的热门站点,都可以在Redis中找到你想要的功能,并将其部署到你的服务器中。

结构丰富

Redis为用户提供了字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等一系列丰富的数据结构,每种数据结构都适用于解决特定的问题。在有需要的时候,用户还可以通过事务、Lua脚本、模块等特性,扩展已有数据结构的功能,甚至从零实现自己专属的数据结构。通过这些数据结构和特性,Redis能够确保用户可以使用适合的工具去解决问题。

服务安装

这里就不说服务安装了,大家可以到官网自行下载安装:https://redis.io/download

Go 语言准备

安装依赖包

这里我用的是这个:

1
go get -u gopkg.in/redis.v5

当然也可以使用这个:

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

Go连接Redis

redis包自带了连接池,会自动维护redis连接,因此创建一次client即可,不要查询一次redis就关闭client

这是使用gopkg.in/redis.v5 建立的链接也是我使用的方式 我的代码在这里

代码是使用比较通用的配置文件模式,下面的代码是 client 建立逻辑位置在 https://github.com/CoolGoPkg/redis-go/blob/master/client/client.go。
使用 Init 方法初始化 LocalRedis,再此之后的代码示例都用 LocalRedis 这个 redis 链接句柄

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
35

var LocalRedis *goredis.Client

// 初始化本地redis
func Init() {
conf := new(config)
LoadConf(conf, "../conf/conf.yaml")
fmt.Println(conf)
LocalRedis = conf.LocalRedis.NewRedisClient()
}

type RedisConfig struct {
Host string
Port int
Auth string
DB int
}

func (c RedisConfig) NewRedisClient() *goredis.Client {
address := fmt.Sprintf("%s:%d", c.Host, c.Port)
cli := NewRedisClient(address, c.Auth, c.DB)
if err := cli.Ping().Err(); err != nil {
panic(err)
}
return cli
}


func NewRedisClient(address, password string, db int) *goredis.Client {
return goredis.NewClient(&goredis.Options{
Addr: address,
Password: password,
DB: db,
})
}

下面一段是配置文件,位置在:https://github.com/CoolGoPkg/redis-go/blob/master/conf/conf.yaml 配置文件的一些选项我也不过多赘述了大家可以自己尝试着去用,我只用了最基本的链接配置。

1
2
3
4
5
6
7
8
local_redis:
host: "127.0.0.1"
port: 6379
auth: ""
db: 1
max_idle: 40
idle_timeout: 240

以上gopkg.in/redis.v5 是我后续用来进行 Golang 代码示例编写的第三方包,我对比了一下发现和github.com/go-redis/redis相比两者差距不大,但有什么调用方式上的差异我也不太清楚

当然也可以用github.com/go-redis/redis 这里我简单写一个初始化链接的方法:

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


// 声明一个全局的redisDb变量
var redisDb *redis.Client

// 根据redis配置初始化一个客户端
func initClient() (err error) {
redisDb = redis.NewClient(&redis.Options{
Addr: "localhost:6379", // redis地址
Password: "", // redis密码,没有则留空
DB: 0, // 默认数据库,默认是0
})

//通过 *redis.Client.Ping() 来检查是否成功连接到了redis服务器
_, err = redisDb.Ping().Result()
if err != nil {
return err
}
return nil
}

func main() {
err := initClient()
if err != nil {
//redis连接错误
panic(err)
}
fmt.Println("Redis连接成功")
}

接下来我就会按照该文罗列的学习框架来记录 Golang 调用 Redis 的各种姿势