设为首页 收藏本站
查看: 1002|回复: 0

[经验分享] golang操作Redis(redigo基础篇)

[复制链接]

尚未签到

发表于 2018-11-7 06:40:05 | 显示全部楼层 |阅读模式
  现在的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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631651-1-1.html 上篇帖子: Java操作Redis-LBD 下篇帖子: Redis文件连接数不够导致listen sock总是可读CPU跑满
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表