Go實戰-redis的基本使用

棋佈發表於2020-10-18

前面已經介紹過redis的池建立,以及叢集方式的建立。首先看下基本的使用程式碼:

//建立連線
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):刪除表中指定位置區間的元素

以上來自於網友的總結,我稍微加了一點補充。

Stream操作

XAdd:新增訊息
XRead:消費訊息
XDel:刪除訊息
XGroup:消費組管理
XReadgroup:分組消費
XRange: 獲取沒有刪除標識的訊息列表
XLen:獲取整個Stream的訊息長度
Del:刪除整個Stream的訊息
XPending: 檢視未處理訊息
XAck:確認訊息已經被處理
XClaim:轉移訊息
XInfo:檢視佇列資訊
XTrim:訊息佇列容量
XRevrange:逆序獲取訊息佇列中的訊息

看函式名就可以看出,stream就是新增了ack機制的訊息佇列,也可以達到消費確認的效果,感覺是不是很叼,後續再出個支援分散式事務機制是不是就可以吊打RabbitMP和RocketMQ了?只是假設,畢竟專業的工具做專業的事情。

一次性訊息的釋出訂閱,實現實時訊息的傳遞,似乎對於我這個專案,用不到。不過,既然寫到了,就提一句。


釋出和訂閱
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 協議》,轉載必須註明作者和本文連結
歡迎轉載分享提意見,一起code

相關文章