这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
Redis 是 常用的非关系型数据库系统之一,常用于缓存、分布式系统、消息系统等。关于 Redis 的使用可查看Redis 学习笔记
GoLang 中操作 Redis 的常用工具有redigo和go-redis,接下来以 redisgo 为例讲述 Redis 的操作。
文章概要
- RedisGo 的安装与创建连接
- 数据操作
- 事务操作
- Redis 连接池
详细内容
安装&连接 Redis
安装 redisgo 模块:
go install github.com/gomodule/redigo/redis@latest
创建连接:
conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("123456"))
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer conn.Close()
数据操作
使用Do()方法执行 Redis 操作,该方法的参数为操作和参数数组,如:
_, err := conn.Do("set", "name", "猫猫")
do, err := conn.Do("get", "name")
该方法的第一个返回值为interface{},需要手动转换:
name, _:= redis.String(do, err)
fmt.Println(name)
- 上述转换可简化为
name, _:= redis.String(conn.Do("get", "name"))- 返回值类型转换方法第二个参数的原理是:若其不为空
err != err,则返回nil. err,反之进行后续处理
事务操作
除了使用Do()操作 Redis,还可以使用Send()、Flush()和Receive()更灵活地操作。
Send()将操作写入客户端输出缓冲区;Flush()将输出缓冲区中的操作发往服务端执行;Receive()依次从客户端输入缓冲区取出服务端发送的结果:
conn.Send("get", "name")
conn.Send("get", "age")
conn.Flush()
name, _ := redis.String(conn.Receive())
age, _ := redis.Int(conn.Receive())
fmt.Printf("name: %s, age: %d", name, age)
Do()结合了上述三个方法,首先将传入操作写入输出缓冲区,然后刷新输出缓冲区,最后获取输出缓冲区最后一个返回值作为方法返回值。
因此,使用事务的一个例子如下:
conn.Send("MULTI")
conn.Send("set", "name", "Monroe")
conn.Send("set", "age", 30)
conn.Send("incr", "num")
do, err := conn.Do("EXEC")
- 输入缓冲区为空时
Receive()会导致阻塞
Redis 连接池
在上述示例中,每次创建一个连接,完成操作后便将其关闭,极大浪费了系统资源。为了提高连接利用率,我们引入连接池来管理与 Redis 的连接,在需要时取出已经存在的未使用连接,实现连接复用。
创建连接池的方法如下:
pool := &redis.Pool{
MaxIdle: 5, // 最大空闲连接数
MaxActive: 0, // 最大连接数,0表示无限制
IdleTimeout: 100, // 最大空闲时间
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
获取连接使用连接池的Get()方法:
conn := pool.Get()
关闭连接池使用Close()方法:
pool.Close()
- 关闭连接池后获取连接不会返回异常,但在进行后续操作时会产生异常
- 从连接池获取的连接应使用
Close()方法关闭以归还连接
本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读