redigo 用户指南

翻译 2016年08月31日 14:13:53

连接Connections
Conn接口是访问Redis的主要接口,业务通过调用Dial,DialWithTimeout或者NewConn函数来创建连接。以后会增加共享或者其他类型连接的创建函数。当用完连接以后,应用必须调用连接Close函数。

执行命令
Conn接口有一个通用函数(generic method)来执行Redis方法:
Do(commandName string, args …interface{}) (reply interface{}, err error)
Redis命令参考指南列出了可用的命令。作为例子,Redis APPEND命令使用方法如下:
n, err := conn.Do(“APPEND”, “key”, “value”)
Do方法转换命令参数到二进制串,用于传输到Redis服务器。转换方法如下:
// 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)
Redis命令的响应类型使用以下的Go类型来表示:
// 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.
使用类型断言或者响应值辅助(helper)函数来转换interface{}到特定的Go类型命令结果。

流水线Pipelining
连接Connections使用Send/Flush/Receive来支持命令流水线Pipelining
// Send(commandName string, args …interface{}) error
// Flush() error
// Receive() (reply interface{}, err error)
Send函数把命令内容写到连接connection的输出buffer。Flush函数把输出buffer的内容发送到Redis服务器。Receive函数从服务器读取单条回复。简单的流水线实例如下:
// c.Send(“SET”, “foo”, “bar”)
// c.Send(“GET”, “foo”)
// c.Flush()
// c.Receive() // reply from SET
// v, err = c.Receive() // reply from GET
Do函数组合了Send/Flush/Receive函数的功能。Do函数执行流程第一步,写入命令内容到输出buffer并发送。第二步,接收未定的响应值(pending replies),包括通过Do发送的所有命令的响应。如果接收的任何一个响应值是error,则Do函数返回error。如果响应值没有error则返回最后的响应值(reply)。如果Do函数的命令参数为空字符串“”,则Do函数刷新(flush)输出缓冲区,并接收未定的响应值,而不发送命令。

使用Send和Do函数可以实现流水线事务:
// c.Send(“MULTI”)
// c.Send(“INCR”, “foo”)
// c.Send(“INCR”, “bar”)
// r, err := c.Do(“EXEC”)
// fmt.Println(r) // prints [1, 1]

并发Concurrency
连接Connections支持给Send/Flush 函数 和 Receive 函数各分配一个并发调用方(concurrent caller)。其他对Do函数的调用都不支持并发。

对Redis的并发返回,使用线程安全池(thread-safe Pool)来获取(get),从goroutine内使用和释放连接。Pool返回的连接Connections有如上所述的并发限制。

发布和订阅(Publish and Subscribe)
使用Send/Flush和Receive函数可以实现Pub/Sub 订阅器(subscribers)
// c.Send(“SUBSCRIBE”, “example”)
// c.Flush()
// for {
// reply, err := c.Receive()
// if err != nil {
// return err
// }
// // process pushed message
// }
PubSubConn类型包装Conn,提供易用的函数来实现订阅器。Subscribe, PSubscribe, Unsubscribe, PUnsubscribe函数会Send和flush订阅管理命令。Receive函数在一个类型Switch代码块中转换消息(pubshed message)为用户方便使用的类型。
// psc := redis.PubSubConn{c}
// psc.Subscribe(“example”)
// for {
// switch v := psc.Receive().(type) {
// case redis.Message:
// fmt.Printf(“%s: message: %s\n”, v.Channel, v.Data)
// case redis.Subscription:
// fmt.Printf(“%s: %s %d\n”, v.Channel, v.Kind, v.Count)
// case error:
// return v
// }
// }

响应值辅助函数Reply Helpers
Bool/Int/Bytes/String/Strings和Values函数转换响应值到特定类型的值。为了方便包装连接Connection的Do和Receive函数的调用,这些函数(Bool/Int/Bytes/String/Strings和Values函数)支持error类型作为第二个参数。如果error非空(non-nil),helper函数返回错误。如果error为空,helper函数转换响应到特定类型:
// exists, err := redis.Bool(c.Do(“EXISTS”, “foo”))
// if err != nil {
// // handle error return from c.Do or type conversion error.
// }
Scan函数转换array响应的各个元素为Go类型:
// var value1 int
// var value2 string
// reply, err := redis.Values(c.Do(“MGET”, “key1”, “key2”))
// if err != nil {
// // handle error
// }
// if _, err := redis.Scan(reply, &value1, &value2); err != nil {
// // handle error
// }

相关文章推荐

Go实战--golang中使用redis(redigo和go-redis/redis)

生命不止,继续 go go go !!!以前介绍过golang中如何使用sqlite3: 《Go实战–go语言操作sqlite数据库(The way to go)》今天跟大家分享的是如何在golan...

Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?

自定义 session 结构体:type Session struct { SessionID string `json:"sessionId" bson:"sessionId"` ...
  • defonds
  • defonds
  • 2016年07月21日 17:11
  • 5407

golang redigo 在高并发下的问题。连接池占满CPU

最初我们使用了redigo【github.com/garyburd/redigo/redis】,使用上倒是没有什么不爽的,但是在压测的时候发现一个问题,即连接池的使用。 func factory(na...

Redigo--用池管理redis连接

在golang的项目中,若要频繁的用redis()

Gradle 教程说明 用户指南 第11章 使用 Gradle 命令行

11.1 执行多个任务 每个任务都只执行一次,不管它如何被包含在build:无论是在命令行中指定,或作为一个依赖的另一个任务,或两者兼而有之。 以下四个任务的定义。dist和测试都依赖于 ...

JSP树型标签 Tree Tag 用户指南

下载:http://blog.chinaunix.net/link.php?url=http://www.jenkov.com Demo:http://jenkov.com/prizetagsdem...

Kubernetes用户指南(一)--快速开始、使用k8s配置文件

一、快速开始 1、启动一个简单的容器。 一旦在container中打包好应用并将其commit为image之后,你就可以将其部署在k8s集群上。 ...

SVN的简明用户使用指南,eclipse版本

SVN的简明用户使用指南,eclipse版本

《gradle 用户指南》中文版 第4章 使用Gradle命令行

第4章 使用Gradle命令行目录4.1、执行多个任务4.2、排除任务4.3、发生故障时继续构建4.4、任务名缩写4.5、选择要执行的构建4.6、强制执行任务4.7、获取有关您的构建的信息4.8、演习...

Gradle 1.12用户指南翻译——第四十四章. 分发插件

第四十四章. 分发插件 分发插件目前还是孵化中状态。请务必注意,在以后的 Gradle 版本中,相关的 DSL 和其他配置可能会有所改变。 分发插件便于建立archives,作为该项目要分布的文件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:redigo 用户指南
举报原因:
原因补充:

(最多只允许输入30个字)