GO语言操作Redis
1.安装驱动
go get -u -v github.com/gomodule/redigo/redis
2.连接
Dial(network,address string)(conn,err)
参数1:协议,tcp、udp等,一般会用tcp
参数2:地址,如127.0.0.1:6379
返回值1:连接(socket)
返回值2:错误信息
注意:不要忘了defer关闭连接
3.具体操作
3.1方法一
Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)
Send函数发出指令,Flush将连接的输出缓冲区刷新到服务器,Receive接收服务器返回的数据。
例如:
c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()//把缓冲区命令发到服务器
c.Receive() // 接收set请求返回的数据
v, err = c.Receive() // 接收get请求传输的数据
这里的c表示Dial返回的连接(conn)
3.2方法二(常用)
Do(commandName string, args ...interface{}) (reply interface{}, err error)
参数1:请求名称,如:set、get、mget等
参数2:参数
返回值1:服务器返回的数据(接口类型)
返回值2:错误信息
4.回复助手函数
- Redis中获取一个数据直接用回复助手函数,如:
resp,err:=conn.Do("get","c1")
result,err:=redis.String(resp,err)
- Redis中获取多个数据,这多个数据是同一类型,用相对应的切片接收,如:
resp,err:=conn.Do("mget","t1","t2","t3")
result,err:=redis.Strings(resp,err)
- Redis中获取多个数据,这多个数据是不同类型,用Values+Scan接收,如:
resp,err:=conn.Do("mget","r1","r2","r3")
result,err:=redis.Values(resp,err)
if err != nil {
beego.Error("获取数据失败")
}
var v1 int
var v2 string
var v3 float64
redis.Scan(result,&v1,&v2,&v3)
-
如果数据是非常见类型,用序列化和反序列化:
比如结构体对象切片,存储是容易,但是是以字符串存储,取出时也是字符串,这样数据取出就很难。
解决思路:把结构体对象切片序列化(编码)存储到redis中,获取字节然后反序列化(解码)成我们需要的数据
序列化(字节化):
var buffer bytes.Buffer//容器
enc:=gob.NewEncoder(&buffer)//编码器
err:=enc.Encode(要编码的数据)//编码
//存到Redis,如:
conn.Do("set","newsweb",buffer.bytes())
反序列化(反字节化):
//先获取Redis中的内容:
resp,err:=conn.Do("get","newsweb")
result,_:=redis.Bytes(resp,err)
dec:=gob.NewDecoder(bytes.NewReader(result))//解码器
//定义一个容器,接收解码之后的数据,注意要与编码的数据保持一致
dec.Decode(&接收数据的容器)//解码