golang操作Redis(redigo基础篇)

gotaly · · 4565 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


现在的redis大红大紫,而且很多应用场景都适合使用Reids来做缓存或者直接做存储,典型的如mysql前端缓存、手游里面的排行榜等。那么我们怎样用golang来操作redis呢?

熟悉redis的同学,肯定第一反应就是按照redis的协议,实现一个客户端与redis服务进行通信即可。不熟悉redis的同学,可能会说用cgo封装下官方的c客户端,妥妥的。是的,这两种方法都可以。既然redis这么火,那么这些工作有没有人做呢?答案是肯定的。在redis的官方网站的客户端列表里就有众多golang的客户端。这个时候,可能你又要犯难了,我该用哪一个呢?

熟悉reids的同学都知道,官网加星星的客户端都是好客户端,就像棒子天上的星星一样神奇。可是坑爹的时,golang不同于python有两个都是加星星的,这孰真孰假呢?

具体我也了解,不过大概浏览了下源码,二者都是用golang实现了redis得协议,不过radix的源码感觉不是那么清晰,相对来说redigo的源码可以和命令对上,比较清晰,且redigo说其支持所有的redis命令。然后又网上搜了几篇文章1/文章2,最终还是选择了redigo来尝试。

1、建立连接

conn聽,聽err聽:=聽redis.DialTimeout("tcp",聽":6379",聽0,聽1*time.Second,聽1*time.Second)

参数的意义分别是网络类型“tcp”、地址和端口、连接超时、读超时和写超时时间。有了连接后。我们就可以进行其他操作了。先看下db的大小

size聽,err聽:=聽conn.Do("DBSIZE")
fmt.Printf("size聽is聽%d聽\n",size)

//输出:
size聽is聽8

在使用完后,通过调用聽conn.Close()聽关闭连接。

2、基本命令执行

对于最基本的命令使用,我们统一调用:

Do(commandName聽string,聽args聽...interface{})聽(reply聽interface{},聽err聽error)

这个接口,整个过程就和我们使用redis命令一样。

我们知道在redis的协议中,都是按照字符流的,那么Do函数是如何进行序列化的呢?下面是其转换规则:

Go聽Type聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Conversion

[]byte聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Sent聽as聽is
string聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Sent聽as聽is
int,聽int64聽聽聽聽聽聽聽聽聽聽聽聽聽聽strconv.FormatInt(v)
float64聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽strconv.FormatFloat(v,聽'g',聽-1,聽64)
bool聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽true聽->聽"1",聽false聽->聽"0"
nil聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽""
all聽other聽types聽聽聽聽聽聽聽聽聽fmt.Print(v)

其实就是byte数组和字符串不变,整形和浮点数转换成对应的字符串,bool用1或者0表示,nil为空字符串。

下面再看下执行后得到的结果返回值的类型:

Redis聽type聽聽聽聽聽聽聽聽聽聽聽聽聽聽Go聽type

error聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽redis.Error
integer聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽int64
simple聽string聽聽聽聽聽聽聽聽聽聽聽string
bulk聽string聽聽聽聽聽聽聽聽聽聽聽聽聽[]byte聽or聽nil聽if聽value聽not聽present.
array聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽[]interface{}聽or聽nil聽if聽value聽not聽present.

如上表,redis中得类型会对应的转换成左边go中得类型,无需多解释。我们来看几个例子:

conn聽,聽err聽:=聽redis.DialTimeout("tcp",聽":6379",聽0,聽1*time.Second,聽1*time.Second)
if聽err聽!=聽nil聽{
聽聽聽聽panic(err)
}
size聽,err:=聽conn.Do("DBSIZE")
fmt.Printf("size聽is聽%d聽\n",size)

_,err聽=聽conn.Do("SET","user:user0",123)
_,err聽=聽conn.Do("SET","user:user1",456)
_,err聽=聽conn.Do("APPEND","user:user0",87)

user0,err聽:=聽redis.Int(conn.Do("GET","user:user0"))
user1,err聽:=聽redis.Int(conn.Do("GET","user:user1"))

fmt.Printf("user0聽is聽%d聽,聽user1聽is聽%d聽\n",user0,user1)

conn.Close()

从redis传回来得普通对象(整形、字符串、浮点数)。redis提供了类型转换函数供转换:

func聽Bool(reply聽interface{},聽err聽error)聽(bool,聽error)
func聽Bytes(reply聽interface{},聽err聽error)聽([]byte,聽error)
func聽Float64(reply聽interface{},聽err聽error)聽(float64,聽error)
func聽Int(reply聽interface{},聽err聽error)聽(int,聽error)
func聽Int64(reply聽interface{},聽err聽error)聽(int64,聽error)
func聽String(reply聽interface{},聽err聽error)聽(string,聽error)
func聽Strings(reply聽interface{},聽err聽error)聽([]string,聽error)
func聽Uint64(reply聽interface{},聽err聽error)聽(uint64,聽error)

这里只是举了set和get命令。其他的例子可以参见redigo的conn_test.go



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:gotaly

查看原文:golang操作Redis(redigo基础篇)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4565 次点击  
加入收藏 微博
1 回复  |  直到 2018-11-29 11:11:24
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传