Redis系列六、redis的五種資料結構和相關指令之Sorted Set
阿新 • • 發佈:2019-02-19
本節中將介紹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