redigo简单理解
package main
import (
   "fmt"
   "github.com/gomodule/redigo/redis"
)
func main()  {
   // 官方地址:https://godoc.org/github.com/gomodule/redigo/redis#pkg-examples
   /*****************************  redis连接  *********************************/
   // option := redis.DialPassword("123456") 如果redis有密码,放在第三个选项
   c, err := redis.Dial("tcp", "127.0.0.1:6379")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer c.Close()
   /*****************************  Do方法  *************************************/
   // 执行redis语句的通用方法
   // 可执行的命令参考 :https://redis.io/commands
   // set name card 成功返回ok
   res,err := c.Do("SET", "NAME", "card")
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(res)
   // get name 成功返回interface{}
   res, err = c.Do("GET", "NAME")
   if err != nil {
      fmt.Println(err)
   }
   // 进行类型断言
   switch t := res.(type) {
   case []byte:
      fmt.Println(string(t))
   }
   /*****************************  管道  *************************************/
   // redigo支持管道操作Send(),Flush(),Receive()
   // Send()  发送命令到输出缓冲区。
   // Send(commandName string, args ...interface{}) error
   // Flush() 写入命令并刷新输出缓冲区。
   // Flush() error
   // Receive()接收服务器的返回值
   // Receive() (reply interface{}, err error)
   c.Send("SET", "foo", "bar")    // 设置语句到缓冲区
   c.Send("GET", "foo")         // 设置语句到缓冲区
   c.Flush()                                // 发送语句
   res,_ =c.Receive()                         // 接收第一个Send()的返回值
   fmt.Println(res)
   res,_ = c.Receive()                            // 接收第二个Send()的返回值
   fmt.Println(res)
   // Do方法结合了Send,Flush和Receive方法的功能。
   // Do方法首先写入命令并刷新输出缓冲区。
   // 接下来,Do方法接收所有待处理的回复,包括Do执行的命令的回复。
   // 如果收到的任何回复都是错误,则Do返回错误。 如果没有错误,则Do返回最后一个返回值。
   // 如果Do方法的命令参数是“”,则Do方法将刷新输出缓冲区并接收挂起的回复而不发送命令。
   // MULTI类似于事务的begin commit事务处理
   c.Send("MULTI")
   c.Send("INCR", "money")
   c.Send("INCR", "count")
   r, err := c.Do("EXEC")
   fmt.Println(r) // [1,1]
   /*****************************  并发  *************************************/
   // redigo支持一个并发调用Receive()方法和一个并发调用Send()和Flush()方法
   // 不支持其他并发,包括对Do方法的并发调用
   // 如果需要完全并发访问redis,需要使用线程安全池goroutine中获取,使用和释放连接。
   // 从线程中返回具有前一段时间描述的并发限制
   // 关于redis连接池会单独写一个
   /*****************************  发布和订阅  *******************************/
   // 扩展:SUBSCRIBE、UNSUBSCRIBE和PUBLISH 三个命令实现了发布与订阅信息泛型.
   // 在这个实现中, 发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),
   // 而是将信息发送给频道(channel), 然后由频道将信息转发给所有对这个频道感兴趣的订阅者。 
   // 也就是说发送者无须知道任何关于订阅者的信息, 而订阅者也无须知道是那个客户端给它发送信息,
   // 它只要关注自己感兴趣的频道即可
   // 对发布者和订阅者进行解构(decoupling),可以极大地提高系统的扩展性(scalability),
   // 并得到一个更动态的网络拓扑(network topology)。
   // redis可以订阅任意数量的频道。
   // 通过使用Send(),Flush(),和Receive()方法实现 Pub / Sub订阅者。
   // 订阅者
   // c.Send("SUBSCRIBE", "example")
   // c.Flush()
   // for {
   //     reply, err := c.Receive()
   //     if err != nil{
   //        fmt.Println(err)
   // }
   // // 处理接收到的信息
   // fmt.Println(reply)
   // }
   // PubSubConn类型使用便捷方法包装Conn以实现订阅者。
   // Subscribe,PSubscribe,Unsubscribe和PUnsubscribe方法发送和刷新订阅管理命令。
   // receive方法将推送的消息转换为方便的类型,以便在switch中使用。
   // psc := redis.PubSubConn{Conn: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:
   //     fmt.Println(v)
   //  }
   // }
   /*****************************  返回值助手函数  *******************************/
   // Bool,Int,Bytes,String,Strings和Values函数将返回值转换为特定类型的值。
   // 为了方便地包含对连接Do和Receive方法的调用,这些函数采用了类型error的第二个参数。
   // 如果错误是非nil,则辅助函数返回错误。 如果错误为nil,则该函数将回复转换为指定的类型
   exists, err := redis.Bool(c.Do("EXISTS", "foo"))
   if err != nil {
      // handle error return from c.Do or type conversion error.
   }
   fmt.Println(exists)
}												
											redigo简单理解的更多相关文章
- git的简单理解及基础操作命令
		
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
 - 简单理解Struts2中拦截器与过滤器的区别及执行顺序
		
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
 - [转]简单理解Socket
		
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
 - Js  职责链模式 简单理解
		
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
 - Deep learning:四十六(DropConnect简单理解)
		
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
 - Deep learning:四十二(Denoise Autoencoder简单理解)
		
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
 - 简单理解dropout
		
dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...
 - 我们为之奋斗过的C#-----C#的一个简单理解
		
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
 - 简单理解ECMAScript2015中的箭头函数新特性
		
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
 
随机推荐
- c语言实现CRC校验和
			
最近在摄像头采集的数据清晰度上需要加强,则在每一帧传输的数据包后边加了CRC校验和.CRC校验和有16位的,也有32位的.至于CRC校验和算法原理,我是在百度上学习的,其实网上有很多这种资料.简单的说 ...
 - Git——Git常用命令速查表
 - JQuery实现AJAX实例
			
<script type="text/javascript" src="ReportServer?op=emb&resource=finereport.js ...
 - HDU-5384
			
Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
 - hdu 1226(同余搜索)
			
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
 - poj 1579(动态规划初探之记忆化搜索)
			
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17843 Accepted: 9112 ...
 - (编译)使用 AppCenter 持续输出导出到 Application Insights
			
原文地址:https://blog.xamarin.com/appcenter-continuous-export-application-insights/ 五星手机应用有一个特殊的特点:他们不会放 ...
 - spring mvc 表单提交 乱码
			
1.在web.xml添加过滤器: <filter> <filter-name>SpringCharacterEncoding</filter-name> <f ...
 - Nodejs Bot学习
			
关于示例部分可以参考<BotFramework Nodejs示例><BotBuilder Nodejs示例查看> Bot Framework Nodejs SDK包括几种与用户 ...
 - vue-music 关于playlist (底部播放列表组件)
			
建立playlist.vue 组件,在player.vue 组件中引用,点击迷你播放器的播放列表按钮由下至上弹出这个层,所以在player.vue 播放器组件中引用 在playlist.vue 组件中 ...