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 连接池机制,并提供了丰富的类型转换接口,减少了额外的类型判断和转换代码。