1. 程式人生 > >Redis系列六、redis的五種資料結構和相關指令之Sorted Set

Redis系列六、redis的五種資料結構和相關指令之Sorted Set

本節中將介紹Redis支援的主要資料結構,以及相關的常用Redis命令。redis是一種基於鍵值對(key-value)的記憶體資料庫,redis資料結構可以分為string、hash、list、set、sorted set。

redis的五種資料結構和相關指令之有序集合sorted set

有序集合sorted set

有序集合與集合一樣,元素都不能重複;Sorted Set中的每個元素都需要指派一個分數(score),Sorted Set會根據score對元素進行升序排序。如果多個member擁有相同的score,則以字典序進行升序排序。
常用於排行榜,如視訊網站需要對使用者上傳視訊做排行榜,或點贊數與集合有聯絡,不能有重複的成員。
在這裡插入圖片描述

與LIST和SET對比

在這裡插入圖片描述

1、常用命令

在這裡插入圖片描述

2、增刪指令

新增指令

zadd key [NX|XX] [CH] [INCR] score member [score member…]

  • XX: 僅僅更新存在的成員,不新增新成員。

  • NX: 不更新存在的成員。只新增新成員。

  • CH: 修改返回值為發生變化的成員總數,原始是返回新新增成員的總數 (CH 是 changed 的意思)。更改的元素是新新增的成員,已經存在的成員更新分數。 所以在命令中指定的成員有相同的分數將不被計算在內。注:在通常情況下,ZADD返回值只計算新新增成員的數量,注意: 如果和incr一起使用的時候,返回的會是incr的結果。

  • INCR: 當ZADD指定這個選項時,成員的操作就等同ZINCRBY命令,對成員的分數進行遞增操作。

    zadd user:3 200 james //james的點贊數1, 返回操作成功的條數1
    zadd user:3 200 james 120 mike 100 lee// 返回3
    
    zadd test:1 nx 100 james   //鍵test:1必須不存在,主用於新增
    zadd test:1 xx incr 200 james   //鍵test:1必須存在,主用於修改,此時為300
    zadd test:1 xx ch incr -299 james //返回操作結果1,300-299=1
    zrange test:1 0 -1 withscores  //檢視點贊(分數)與成員名
    

增加分數

zincrby user:3 10 lee     //成員lee的分數加10
zadd user:3 xx incr 10 lee //和上面效果一樣

刪除指令

zrem user:zan jame mike //返回成功刪除2個成員,還剩lee

刪除指定排名內的升序元素:

zremrangebyrank user:3 0 1 //分數升序排列,刪除第0個與第1個,只剩james

刪除指定分數範圍的成員

zadd user:5 200 james 120 mike 100 lee//先插入測試資料
zremrangebyscore user:5 100 300     //刪除分數在100與300範圍的成員
zremrangebyscore user:5 (100 +inf    //刪除分數大於100(不包括100),還剩lee

3、檢視指令

檢視分數

zscore user:3 james     //檢視james的點贊數(分數),返回200

檢視排名

zrank user:3 james  //返回名次:第3名返回2,從0開始到2,共3名
zrevrank user:3 james //返回0, 反排序,點贊數越高,排名越前

返回指定排名範圍的分數與成員

zadd user:4 200 james 120 mike 100 lee//先插入資料
zrange user:4 0 -1 withscores //返回結果如下圖

在這裡插入圖片描述

zrevrange user:4 0 -1 withscores   //倒序,結果如下圖

在這裡插入圖片描述

返回指定分數範圍的成員

zrangebyscore user:4 110 300 withscores //返回120 lee ,200 James, 由低到高 
zrevrangebyscore user:4 300 110 withscores //返回200james 120lee,由高到低
 
zrangebyscore user:4 (110 +inf withscores//110到無限大,120mike 200james 
zrevrangebyscore user:4 (110 -inf withscores//無限小到110,返回100 lee

返回指定分數範圍的成員個數:

zcount user:4 110 300  //返回2,由mike120和james200兩條資料

統計成員數量

zcard test:1     //計算成員個數, 返回1

4、有序集合交集

格式:

zinterstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • destination:交集產生新的元素儲存鍵名稱。
  • numkeys: 要做交集計算的鍵個數,匹配不上會有語法錯誤,會執行不了。
  • key :元素鍵值。
  • weights:每個被選中的鍵對應值乘weight, 預設為1。

初始化資料:

zadd user:7 1 james 2 mike 4 jack 5 kate      //初始化user:7資料
zadd user:8 3 james 4 mike 4 lucy 2 lee  6 jim  //初始化user:8資料

交集例子:

 zinterstore user_jj 2 user:7 user:8 aggregate sum //2代表鍵合併個數,
//aggregate sum可加也不可加上,因為預設是sum
//結果user_jj:4james(1+3), 6mike(2+4) 

zinterstore user_jjmax 2 user:7 user:8 aggregate max 或min 
//取交集最大的分數,返回結果 3james  4mike, min取最小

weights的使用:

zinterstore user_jjweight 2 user:7 user:8 weights 8 4 aggregate max
//1,取兩個成員相同的交集,user:7->1 james  2 mike;  user:8->3 james  4 mike
//2,將user:7->james 1*8=8,  user:7->mike 2*8 =16, 最後user:7結果 8 james  16 mike; 
//3,將user:8-> james 3*4=12, user:8->mike 4*4=16,最後user:8結果12 james  16 mike
//4,最終相乘後的結果,取最大值為  12 james 16mike
//5, zrange user_jjweight 0 -1 withscores 查詢結果為  12 james 16mike

5、有序集合並集(合併去重)

格式:

zunionstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • destination:交集產生新的元素儲存鍵名稱
  • numkeys: 要做交集計算的鍵個數 key :元素鍵值
  • weights:每個被選中的鍵對應值乘weight, 預設為1

eg:

zunionstore user_jjweight2 2 user:7 user:8 weights 8 4 aggregate max
//與以上zinterstore一樣,只是取並集,指令一樣

6、有序集合應用場景

排行榜系統,如視訊網站需要對使用者上傳的視訊做排行榜
點贊數:

zadd user:1:20180106 3 mike  //mike獲得3個贊

再獲一讚:

zincrby user:1:20180106 1 mike  //在3的基礎上加1

使用者作弊,將使用者從排行榜刪掉:

zrem user:1:20180106 mike

展示贊數最多的5個使用者:

zrevrangebyrank user:1:20180106  0  4 

檢視使用者贊數與排名:

zscore user:1:20180106 mike   
zrank user:1:20180106 mike