在 Golang 中操作 Redis
最开始是去年在上家公司通过《Go 语言编程》这本书接触到的 Golang,据说是作者、七牛 CEO 许式伟送给公司的。
虽然个人感觉这书的内容过于蜻蜓点水,不过至少还是通过大致翻看让我对 Golang 这门语言产生了浓厚兴趣。
然后去年底又通过《Go Web 编程》这本书系统学习了语法,并写了[这篇文章](/blog/2013/12/14/hello-golang/)。
最近终于把这本书剩余大部分章节都过完了,这里是我写的所有 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 命令文档。