Redis(REmote DIctionary Server)是一个十分常用的跨平台非关系型数据库。其使用 ANSI C 语言编写,支持网络,可基于内存、分布式、可选持久性的键值存储数据库,并提供多种语言的 API。
而 Go 语言,作为近年来热度不断上升的编程语言,其在 Web 服务端的表现尤为抢眼。因此,如何使用 Go 语言进行 Redis 的操作,乃至于如何支持 Redis 丰富的各种特性,成为一个十分重要的问题。Redigo,就是一个十分优秀的 Go 语言实现的 Redis 客户端库。
简介
Redigo,是 gomodule 在 Github 上开源的 Go 语言 Redis 客户端库,目前版本为 v1.8.4。
Redigo 实现了包括 Redis 连接、连接池、命令执行、管道、发布订阅,和 Lua 脚本执行等特性,提供了丰富的 Redis 特性支持。
此外,Redigo 充分利用了 Go 语言的并发特性,提供了高效可靠的 Redis API 实现。另外,也提供了全面的类型转换和断言接口,为弱类型的 Redis 和 强类型的 Go 语言之间建立了方便开发的桥梁。
Redigo 使用广泛,已众多项目的基础依赖,并且已成为 Go 语言的 Redis 客户端实现的事实标准之一。其接口实现合理,内部逻辑优雅,不失为一个优秀的 Go 语言示范项目。
使用
要使用 Redigo,首先使用 Go Module 安装:
go get -u github.com/gomodule/redigo
安装完成后,就可以在项目中使用 Redigo 了。
我们来看一个最简单的例子:
package main
import (
"os"
"github.com/gomodule/redigo/redis"
)
func main() {
c, err := redis.DialURL(os.Getenv("REDIS_URL"))
if err != nil {
// handle connection error
}
defer c.Close()
}
在这个例子中,我们首先引入 Redigo 库,然后,使用 dialURL 函数,创建 redis 连接。dialURL 定义如下:
func DialURL(rawurl string, options ...DialOption) (Conn, error)
其接受一个 Redis URL,以及其他配置参数,返回一个 redis.Conn 类型的 redis 连接,以及错误返回值。如果连接没有出错,就使用该连接,进行进一步操作。最终,需要关闭 redis 连接,释放资源。
Redigo 使用通用的 Do 接口来执行命令。redis.Conn 定义了方法 Do,定义如下:
Do(commandName string, args ...interface{}) (reply interface{}, err error)
一个简单的使用例子如下:
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
func main() {
...
if _, err = c.Do("SET", "foo", 1); err != nil {
fmt.Println(err)
return
}
exists, err := redis.Bool(c.Do("EXISTS", "foo"))
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%#v\n", exists)
}
在这个例子中,我们使用 Do,首先执行了 SET 命令,存储了键值对 foo : 1,然后,在使用 EXISTS 命令,查询键 foo 是否存在,并把返回值使用 redis.Bool 转换为布尔类型。
总结
Redigo 实现了 Go 语言的 Redis 客户端库,为使用 Go 语言进行 Web 开发等提供了十分关键的基础工具。
Redigo 实现了丰富的 Redis 特性,包括管道、发布订阅、慢日志等,是一个十分优秀的 Redis API 实现。
同时,Redigo 充分利用了 Go 语言特性,利用 goroutine 和 channel,以及相应的并发控制库,实现了高效可靠的 Redis 连接池机制,并提供了丰富的类型转换接口,减少了额外的类型判断和转换代码。