在 Golang 中操作 Redis

最开始是去年在上家公司通过《Go 语言编程》这本书接触到的 Golang,据说是作者、七牛 CEO 许式伟送给公司的。

虽然个人感觉这书的内容过于蜻蜓点水,不过至少还是通过大致翻看让我对 Golang 这门语言产生了浓厚兴趣。

然后去年底又通过《Go Web 编程》这本书系统学习了语法,并写了这篇文章

最近终于把这本书剩余大部分章节都过完了,这里是我写的所有 Demo

当年在学校写 ASP / ASP.NET 、JavaEE 的时候,对 NoSQL 有过一定了解,不过真正做项目用的还是 SQL Server 、MySQL 、Oracle 、Sybase 等传统关系型数据库。

11 年重心转移到移动开发后,更是很少关注这些后端相关技术。

但今日已不同往昔,Redis 、MongoDB 等非关系型数据库在大数据时代正变得越发重要。

这里总结下 Golang 中 Redis 的用法。

Redis 的安装和初始化

OS X 、Ubuntu 下安装 Redis :

brew install redis
apt-get install redis

OS X 、Ubuntu 下启动 Redis :

brew services start redis
service redis-server start

改用 stop / restart 可停止/重启 Redis 服务。

OS X 、Ubuntu 下修改 Redis 配置文件:

vim /usr/local/homebrew/etc/redis.conf
vim /etc/redis/redis.conf

将其中的 appendonly 设置为 yes 可开启持久化,每条命令会被 append 到一个文件中保存,重启时自动读取并逐条执行。

通过 redis-cli 可以进入命令模式:

Golang 的 Redis 驱动选择

书中采用的是 hoisie/redis 这个项目,但实际上它有部分 Redis 命令不支持,而且更新也不够频繁。

GitHub 上发现了一个更好的项目 redigo ,不仅能完美支持所有 Redis 命令,API 更加友好,而且有规范的文档,更新也很频繁。

安装项目依赖:

go get github.com/garyburd/redigo/redis

这个项目提供的 API 确实很强大,但因为它能完美支持所有 Redis 命令,所以基本使用 Do 方法就能完成几乎所有常用操作:

conn.Do("command", "arg1", "arg2", ...)

Golang 中操作 Redis

连接 Redis 服务器:

conn, _ := redis.Dial("tcp", "localhost:6379")

调用 AUTH 命令获得授权:

conn.Do("AUTH", "password")

延迟自动关闭连接:

defer conn.Close()

调用 SET 命令设置单个值:

conn.Do("SET", "email", "i@RincLiu.com")

调用 EXISTS 命令检查某个值是否存在:

exists, _ := redis.Bool(conn.Do("EXISTS", "email"))
fmt.Printf("Is email exists: %#v\n", exists)

调用 GET 命令读取单个值:

email, _ := redis.String(conn.Do("GET", "email"))
fmt.Printf("email: %s\n", email)

调用 RPUSH 命令添加元素到 list :

conn.Do("RPUSH", "platformList", "iOS")
conn.Do("RPUSH", "platformList", "Android")
conn.Do("RPUSH", "platformList", "WindowsPhone")

调用 SORT 命令对 list 元素排序:

conn.Do("SORT", "platformList", "ASC", "ALPHA", "LIMIT", "0", "2")

排序操作默认只针对数值元素,如果包含非数值元素,需要带上 ALPHA 参数。

调用 LRANGE 命令获取 list 子序列:

listItems, _ := redis.Values(conn.Do("LRANGE", "platformList", 0, 2))
fmt.Println("Items in List:")
for _, itemV := range listItems {
	fmt.Printf("%s\n", itemV)
}

调用 SADD 命令添加元素到 set :

conn.Do("SADD", "platformSet", "Android")
conn.Do("SADD", "platformSet", "iOS")
conn.Do("SADD", "platformSet", "WindowsPhone")

调用 SMEMBERS 命令获取 set 子集:

setMembers, _ := redis.Values(conn.Do("SMEMBERS", "platformSet"))
fmt.Println("Items in Set:")
for _, itemV := range setMembers {
	fmt.Printf("%s\n", itemV)
}

调用 HSET 命令添加键值对到 set :

conn.Do("HSET", "userKVSet", "name", "Rinc")
conn.Do("HSET", "userKVSet", "email", "i@RincLiu.com")

调用 HKEYS 命令读取键值对 set 的所有 key :

kvKeys, _ := redis.Values(conn.Do("HKEYS", "userKVSet"))

调用 HGET 命令读取键值对 set 中的键值对:

fmt.Println("Items in KVSet:")
for _, kvKey := range kvKeys {
	kvValue, _ := conn.Do("HGET", "userKVSet", kvKey)
	fmt.Printf("%s: %s\n", kvKey, kvValue)
}

以上仅列举了常用操作,更多用法可参考 redigo 项目 API 文档以及 Redis 命令文档