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简单理解的更多相关文章

  1. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

  4. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  5. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  6. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  7. 简单理解dropout

    dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...

  8. 我们为之奋斗过的C#-----C#的一个简单理解

    我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...

  9. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

随机推荐

  1. IDEA 内存设置

    -server -Xms2g -Xmx2g -XX:NewRatio=3 -Xss16m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled - ...

  2. C语言面试题总结(一)

    以前的记录都在电子笔记里,倒不如拿出来,有错的地方和大家交流. 1.指针操作: 如下例,设a内存地址为OX00 int a =10; int *p = &a; *a 编译错误 a表示10 *p ...

  3. Leetcode 之Longest Valid Parentheses(39)

    有一定的难度.用堆栈记录下所有左符的位置,用变量记录下孤立右符的位置. int longestValidParentheses(const string& s) { stack<int& ...

  4. poj 1182 (扩展并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 58979   Accepted: 17247 Description ...

  5. 云联云通讯报错:应用与模板id不匹配,解决方法

    <statusMsg>应用与模板id不匹配</statusMsg> 这种一般是后端服务器上配置的APP ID和模板ID所属的APP不一致造成的 找到发送模板短信的方法,修改ap ...

  6. javascript高程笔记:逻辑与和逻辑或

    逻辑与和或 逻辑与 当 && 前后两个操作数都是布尔值,无可厚非,同时为true才为true.与其他强类型语言不同的是,javascript逻辑与前后的操作数可以应用于任何类型. 而且 ...

  7. 解决网页中Waiting (TTFB)数据加载过慢的问题

    解决网页中Waiting (TTFB)数据加载过慢的问题 最近做了一个网页,在本地测试良好,数据可以得到很快的反馈,但是当部署到云端Linux上时候,就会出现加载缓慢的问题.本地测试,得到数据大概3s ...

  8. vault-in-kubernetes

    http://www.devoperandi.com/vault-in-kubernetes-take-2/ https://www.usenix.org/sites/default/files/co ...

  9. 让浏览器支持Webp

    Webp介绍 webp是一种同时提供了有损压缩与无损压缩的图片档案格式 ,衍生自影像编码格式VP8,是由Google在购买On2 Technologies后发展出来,以BSD授权条款释出.根据 Goo ...

  10. 2018 icpc 徐州现场赛G-树上差分+组合数学-大佬的代码

    现场赛大佬打印的代码,观摩了一哈. 写了注释,贴一下,好好学习.%%%PKU 代码: //树上差分(LCA) #include<bits/stdc++.h> #define For(i,x ...