前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go实战-redis的基本使用

Go实战-redis的基本使用

作者头像
用户6680840
发布2022-06-08 10:45:31
1630
发布2022-06-08 10:45:31
举报
文章被收录于专栏:菜鸟程序员的自我修养

前面已经介绍过redis的池创建,以及集群方式的创建。首先看下基本的使用代码:

代码语言:javascript
复制
//创建连接
redisPool := redisClient.ConnectRedisPool()
    defer redisPool.Close()
    _, err = redisPool.Ping().Result()
    if err != nil {
        logs.Info("Login/login redis ping error: ", err)
    }
//设置自增和过期时间
redisPool.Incr(login.Name)
redisPool.Expire(login.Name, time.Minute)
//获取rediskey值对应的value
loginTimes, _ := redisPool.Get(login.Name).Result()

示例仅展示了基本的string操作的存和取,其他的操作可以依葫芦画瓢的进行配置,基本和执行redis的命令用法一致

五种数据结构的基本操作汇总

String 操作

  Set(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的value   GetSet(key, value):给名称为key的string赋予上一次的value   MGet(key1, key2,…, key N):返回库中多个string的value   SetNX(key, value):添加string,名称为key,值为value   SetXX(key, time, value):向库中添加string,设定过期时间time   MSet(key N, value N):批量设置多个string的值   MSetNX(key N, value N):如果所有名称为key i的string都不存在   Incr(key):名称为key的string增1操作   Incrby(key, integer):名称为key的string增加integer   Decr(key):名称为key的string减1操作   Decrby(key, integer):名称为key的string减少integer   Append(key, value):名称为key的string的值附加valuesubstr(key, start, end):返回名称为key的string的value的子串

List 操作

RPush(key, value):在名称为key的list尾添加一个值为value的元素   LPush(key, value):在名称为key的list头添加一个值为value的 元素   LLen(key):返回名称为key的list的长度   LRange(key, start, end):返回名称为key的list中start至end之间的元素   LTrim(key, start, end):截取名称为key的list   LIndex(key, index):返回名称为key的list中index位置的元素   LSet(key, index, value):给名称为key的list中index位置的元素赋值   LRem(key, count, value):删除count个key的list中值为value的元素   LPop(key):返回并删除名称为key的list中的首元素   RPop(key):返回并删除名称为key的list中的尾元素   BLPop(key1, key2,… key N, timeout):lpop命令的block版本。   BRPop(key1, key2,… key N, timeout):rpop的block版本。   RPopLPush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

Hash 操作

  HSet(key, field, value):向名称为key的hash中添加元素field   HGet(key, field):返回名称为key的hash中field对应的value   HMget(key, (fields)):返回名称为key的hash中field i对应的value   HMset(key, (fields)):向名称为key的hash中添加元素field   HIncrby(key, field, integer):将名称为key的hash中field的value增加integer   HExists(key, field):名称为key的hash中是否存在键为field的域   HDel(key, field):删除名称为key的hash中键为field的域   HLen(key):返回名称为key的hash中元素个数   HKeys(key):返回名称为key的hash中所有键   HVals(key):返回名称为key的hash中所有键对应的value   HGetall(key):返回名称为key的hash中所有的键(field)及其对应的value

Set 操作

  SAdd(key, members…):向名称为key的set中添加元素member   SCard(key):返回当前set表元素个数   SDiff(key…):返回两个表中元素的交集/并集/补集   SDiffStore(destination, key…):将两个表交集/并集/补集元素copy到第三个表中   SInter(key…):返回两个表中元素的交集/并集/补集   SInterStore(destination, key…):将两个表交集/并集/补集元素copy到第三个表中   SIsMember(key, member):判断元素是否属于当前表   SMembers(key):返回当前表的所有元素   SMove(source, destination , member):移动当前set表的指定元素到另一个set表   SPop(key):弹出首元素   SPopN(key, count ):弹出多个元素   SRandMember(key):返回表中一个随机元素   SRandMemberN(key, count ):返回表中N个随机元素   SRem(key,members…):移除指定元素   SUnion(key…):返回两个表中元素的交集/并集/补集   SUnionStore(destination, key…):将两个表交集/并集/补集元素copy到第三个表中

ZSet 操作

  ZAdd(key string, members ):增加元素,并设置序号,返回true,重复返回false   ZCard(key):统计元素个数   ZCount(key, min, max ):统计一个索引区间的元素个数   ZIncrBy(key string, increment, member ):对指定元素索引值的增减,改变元素排列次序   ZRange(key string, start, stop):按位置次序返回表中指定区间的元素   ZRank(key, member):返回元素所在表顺序/降序的位置(不是索引) ZRemRangeByRank(key string, start, stop int64):删除表中指定位置区间的元素

以上来自于网友的总结,我稍微加了一点补充。

redis5.0新增stream基本操作

Stream操作

XAdd:添加消息 XRead:消费消息 XDel:删除消息 XGroup:消费组管理 XReadgroup:分组消费 XRange: 获取没有删除标识的消息列表 XLen:获取整个Stream的消息长度 Del:删除整个Stream的消息 XPending: 查看未处理消息 XAck:确认消息已经被处理 XClaim:转移消息 XInfo:查看队列信息 XTrim:消息队列容量 XRevrange:逆序获取消息队列中的消息

看函数名就可以看出,stream就是添加了ack机制的消息队列,也可以达到消费确认的效果,感觉是不是很叼,后续再出个支持分布式事务机制是不是就可以吊打RabbitMP和RocketMQ了?只是假设,毕竟专业的工具做专业的事情。

redis订阅和发布

一次性消息的发布订阅,实现实时消息的传递,似乎对于我这个项目,用不到。不过,既然写到了,就提一句。

代码语言:javascript
复制
发布和订阅
func (c *TaskController) Publish() {
   redisPool := redisClient.ConnectRedisPool()
   defer redisPool.Close()
   _, err := redisPool.Ping().Result()
   if err != nil {
      logs.Info("redis/publish redis ping error: ", err)
      c.Data["json"] = ReturnError(-1003, "发布失败: "+err.Error())
      c.ServeJSON()
      return
   }
   err = redisPool.Publish("message", "hello").Err()
   if err != nil {
      c.Data["json"] = ReturnError(-1003, "发布失败: "+err.Error())
   } else {
      c.Data["json"] = ReturnSuccess("发布成功 ", nil, 0)
   }
   c.ServeJSON()
}
//订阅
func subscribe(redis *redis.Client) {
   //参数1 频道名 字符串类型
   pubsub := redis.Subscribe("message")
   data, err := pubsub.Receive()
   fmt.Println("data", data)
   if err != nil {
      return
   }
   ch := pubsub.Channel()
   datas := make([]string, 0)
   for msg := range ch {
      fmt.Println(msg)
      data = append(datas, msg.String())
   }
}

切记使用goroutine 执行订阅,阻塞状态下就可以接收消息了,场景用不上,看看就好。

本作品采用《CC 协议》,转载必须注明作者和本文链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五种数据结构的基本操作汇总
    • String 操作
      • List 操作
        • Hash 操作
          • Set 操作
            • ZSet 操作
            • redis5.0新增stream基本操作
              • Stream操作
              • redis订阅和发布
              相关产品与服务
              消息队列 CMQ 版
              消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档