01
介绍
在之前的文章介绍过 Golang 操作 Redis 的三方库 go-redis,本文主要介绍另外一个 Golang 操作 Redis 的三方库 redigo,它是 Golang 官方推荐使用的 Redis 客户端。
go-redis 三方库为我们封装了很多函数来执行 Redis 命令,而 redigo 三方库只有一个 Do 函数执行 Redis 命令,更接近使用 redis-cli 操作 Redis,这一点是我个人比较喜欢的,只要熟悉 Redis,就可以轻松使用 redigo 作为客户端操作 Redis,而不需要再去记三方库封装的函数。
使用 go get 命令安装 redigo:
go get github.com/gomodule/redigo/redis
redigo 库中的 Conn 接口是操作 Redis 的主要接口。
type Conn interface {
// Close closes the connection.
Close() error
// Err returns a non-nil value when the connection is not usable.
Err() error
// Do sends a command to the server and returns the received reply.
Do(commandName string, args ...interface{}) (reply interface{}, err error)
// Send writes the command to the client's output buffer.
Send(commandName string, args ...interface{}) error
// Flush flushes the output buffer to the Redis server.
Flush() error
// Receive receives a single reply from the Redis server
Receive() (reply interface{}, err error)
}
阅读 redigo 库的源码,我们可以发现 Conn 接口包含 6 个方法,本文我们主要使用 Do 和 Close。
02
创建连接
redigo 库提供了多个函数创建连接,本文我们使用 Dial 函数创建连接,此外,还可以使用 DialURL 函数和 NewConn 函数创建连接,限于篇幅,本文不准备逐一介绍。
示例代码:
// 连接 redis-server
// 创建连接
c, err := redis.Dial("tcp", ":6379")
if err != nil {
fmt.Printf("redis.Dial() error:%v", err)
return
}
// 关闭连接
defer c.Close()
阅读上面这段代码,我们使用 Dial 函数创建连接,需要注意的是,我们不要忘记关闭连接。
使用该方式主要是为了读者朋友们容易理解,建议在生产环境中使用连接池,避免每次执行命令都需要先创建连接,影响性能。
03
string 操作
redigo 执行 Redis 命令的通用方法是使用 Conn 接口的 Do 函数,Do 函数可以发送命令给 Redis 服务器,并返回 Redis 服务器的回复。
Do(commandName string, args ...interface{}) (reply interface{}, err error)
示例代码:
func stringSet(conn redis.Conn) {
replySet, err := conn.Do("SET", "key1", "value1")
if err != nil {
fmt.Println("SET error: ", err)
}
fmt.Println(replySet)
}
阅读上面这段代码,我们使用 Do 函数执行 Redis 的 set 命令,限于篇幅,更多关于 string 类型的 redis 命令示例代码,请阅读推送到 GitHub 的本文相关代码。
04
复合类型操作
除了操作字符串,我们还会操作复合类型,redigo 库中的 Args 类型提供了操作复合类型的方法 AddFlat。
func (args Args) AddFlat(v interface{}) Args
写操作:
type User struct {
ID int64 `redis:"id"`
Name string `redis:"name"`
}
// struct
func structAdd(conn redis.Conn) {
u1 := User{
ID: 1,
Name: "name1",
}
replyStruct, err := conn.Do("HMSET", redis.Args{}.Add("hkey1").AddFlat(&u1)...)
if err != nil {
fmt.Println("struct err: ", err)
}
fmt.Println(replyStruct)
}
阅读上面这段代码,我们使用 AddFlat 方法将结构体写入 Redis,需要注意的是结构体字段是可导出的字段名称,并且使用了字段标签 redis。
读操作:
func structValues(conn redis.Conn) {
v, err := redis.Values(conn.Do("HGETALL", "hkey1"))
if err != nil {
fmt.Println("redis.Values() err: ", err)
}
// redis.ScanStruct()
u2 := new(User)
if err := redis.ScanStruct(v, u2); err != nil {
fmt.Println("redis.ScanStruct() err: ", err)
}
fmt.Printf("%+v\n", u2)
}
阅读上面这段代码,我们使用两个助手函数 Values 和 ScanStruct,将 Redis 服务器的回复解析到 struct,redigo 还提供了助手函数 ScanSlice 将 Redis 服务器的回复解析到 slice。
限于篇幅,关于 map 和 slice 的示例代码,请阅读推送到 GitHub 上的本文相关代码。
05
总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?