redis-10.sorted_set型別

aliyeye發表於2021-01-20

sorted_set型別

  • 新的儲存需求:資料排序有利於資料的有效展示,需要提供一種可以根據自身特徵進行排序的方式
  • 需要的儲存結構:新的儲存模型,可以儲存可排序的資料
  • sorted_set型別:在set的儲存結構基礎上新增可排序欄位

dZ6LSkswjG.png!large

sorted_set型別資料的基本操作

  • 新增資料

    zadd key score1 member1 [score2 member2]
  • 獲取全部資料

    zrange key start stop [WITHSCORES]
    zrevrange key start stop [WITHSCORES]
  • 刪除資料

    zrem key member [member ...]
  • 按條件獲取資料

    zrangebyscore key min max [WITHSCORES] [LIMIT]
    zrevrangebyscore key max min [WITHSCORES]
  • 條件刪除資料

    zremrangebyrank key start stop
    zremrangebyscore key min max

注意:

  • min於max用於限定搜尋查詢的條件
  • start與stop用於限定查詢範圍,作用於索引,表示開始和結束索引
  • offset與count用於限定查詢範圍,作用與查詢結果,表示開始位置和資料總量
  • 獲取集合資料總量

    zcard key
    zcount key min max
  • 集合交、並操作

    zinterstore destination numkeys key [key ...]
    zunionstore destination numkeys key [key ...]

sorted_set型別資料的擴充套件操作

業務場景

票選廣東十大傑出青年,各類綜藝選秀海選投票
各類資源網站TOP10(電影,歌曲,遊戲等)
聊天室活躍度統計
遊戲好友親密度

業務分析

  • 為所有參與排名的資源建立排序依據

解決方案

  • 獲取資料對應的索引(排名)
    zrank key member
    zrevrank key member
  • score值獲取與修改
    zscore key member
    zincrby key increment member

Tips1:

  • redis應用於計數器組合排序功能對應的排名

sorted_set型別資料操作的注意事項

  • score儲存的資料儲存空間是64位,如果是整數範圍是-9007199254740992~9007199254740992
  • score儲存的資料也可以是一個雙精度的double值,基於雙精度浮點數的特徵,可能會丟失精度,使用時 候要慎重
  • sorted_set 底層儲存還是基於set結構的,因此資料不能重複,如果重複新增相同的資料,score值將被反 復覆蓋,保留最後一次修改的結果

業務場景

基礎服務+增值服務類網站會設定各位會員的試用,讓使用者充分體驗會員優勢。例如觀影試用VIP、遊戲 VIP體驗、雲盤下載體驗VIP、資料檢視體驗VIP。當VIP體驗到期後,如果有效管理此類資訊。即便對於正式 VIP使用者也存在對應的管理方式。

網站會定期開啟投票、討論,限時進行,逾期作廢。如何有效管理此類過期資訊。

解決方案

  • 對於基於時間線限定的任務處理,將處理時間記錄為score值,利用排序功能區分處理的先後順序

  • 記錄下一個要處理的時間,當到期後處理對應任務,移除redis中的記錄,並記錄下一個要處理的時間

  • 當新任務加入時,判定並更新當前下一個要處理的任務時間

  • 為提升sorted_set的效能,通常將任務根據特徵儲存成若干個sorted_set。例如1小時內,1天內,周內, 月內,季內,年度等,操作時逐級提升,將即將操作的若干個任務納入到1小時內處理的佇列中

  • 獲取當前系統時間

    time

Tips2:

  • redis 應用於定時任務執行順序管理或任務過期管理

業務場景

任務/訊息權重設定應用
當任務或者訊息待處理,形成了任務佇列或訊息佇列時,對於高優先順序的任務要保障對其優先處理,如何實現任務權重管理。

解決方案

  • 對於帶有權重的任務,優先處理權重高的任務,採用score記錄權重即可 多條件任務權重設定
    如果權重條件過多時,需要對排序score值進行處理,保障score值能夠相容2條件或者多條件,例如外貿 訂單優先於國內訂單,總裁訂單優先於員工訂單,經理訂單優先於員工訂單

  • 因score長度受限,需要對資料進行截斷處理,尤其是時間設定為小時或分鐘級即可(折算後)

  • 先設定訂單類別,後設定訂單發起角色類別,整體score長度必須是統一的,不足位補0。第一排序規則首 位不得是0

    • 例如外貿101,國內102,經理004,員工008。
    • 員工下的外貿單score值為101008(優先)
    • 經理下的國內單score值為102004

Tips3:

  • redis 應用於即時任務/訊息佇列執行管理
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章