Redis系列六、redis的五种数据结构和相关指令之Sorted Set
本節(jié)中將介紹Redis支持的主要數(shù)據(jù)結(jié)構(gòu),以及相關(guān)的常用Redis命令。redis是一種基于鍵值對(duì)(key-value)的內(nèi)存數(shù)據(jù)庫,redis數(shù)據(jù)結(jié)構(gòu)可以分為string、hash、list、set、sorted set。
redis的五種數(shù)據(jù)結(jié)構(gòu)和相關(guān)指令之有序集合sorted set
有序集合sorted set
有序集合與集合一樣,元素都不能重復(fù);Sorted Set中的每個(gè)元素都需要指派一個(gè)分?jǐn)?shù)(score),Sorted Set會(huì)根據(jù)score對(duì)元素進(jìn)行升序排序。如果多個(gè)member擁有相同的score,則以字典序進(jìn)行升序排序。
常用于排行榜,如視頻網(wǎng)站需要對(duì)用戶上傳視頻做排行榜,或點(diǎn)贊數(shù)與集合有聯(lián)系,不能有重復(fù)的成員。
與LIST和SET對(duì)比
?
1、常用命令
?
2、增刪指令
添加指令
zadd key [NX|XX] [CH] [INCR] score member [score member…]
XX: 僅僅更新存在的成員,不添加新成員。
NX: 不更新存在的成員。只添加新成員。
CH: 修改返回值為發(fā)生變化的成員總數(shù),原始是返回新添加成員的總數(shù) (CH 是 changed 的意思)。更改的元素是新添加的成員,已經(jīng)存在的成員更新分?jǐn)?shù)。 所以在命令中指定的成員有相同的分?jǐn)?shù)將不被計(jì)算在內(nèi)。注:在通常情況下,ZADD返回值只計(jì)算新添加成員的數(shù)量,注意: 如果和incr一起使用的時(shí)候,返回的會(huì)是incr的結(jié)果。
INCR: 當(dāng)ZADD指定這個(gè)選項(xiàng)時(shí),成員的操作就等同ZINCRBY命令,對(duì)成員的分?jǐn)?shù)進(jìn)行遞增操作。
zadd user:3 200 james //james的點(diǎn)贊數(shù)1, 返回操作成功的條數(shù)1 zadd user:3 200 james 120 mike 100 lee// 返回3zadd test:1 nx 100 james ? //鍵test:1必須不存在,主用于添加 zadd test:1 xx incr 200 james ? //鍵test:1必須存在,主用于修改,此時(shí)為300 zadd test:1 xx ch incr -299 james //返回操作結(jié)果1,300-299=1 zrange test:1 0 -1 withscores ?//查看點(diǎn)贊(分?jǐn)?shù))與成員名增加分?jǐn)?shù)
zincrby user:3 10 lee ? ? //成員lee的分?jǐn)?shù)加10 zadd user:3 xx incr 10 lee //和上面效果一樣刪除指令
zrem user:zan jame mike //返回成功刪除2個(gè)成員,還剩lee
刪除指定排名內(nèi)的升序元素:
刪除指定分?jǐn)?shù)范圍的成員
3、查看指令
查看分?jǐn)?shù)
zscore user:3 james ? ? //查看james的點(diǎn)贊數(shù)(分?jǐn)?shù)),返回200查看排名
zrank user:3 james ?//返回名次:第3名返回2,從0開始到2,共3名 zrevrank user:3 james //返回0, 反排序,點(diǎn)贊數(shù)越高,排名越前返回指定排名范圍的分?jǐn)?shù)與成員
zadd user:4 200 james 120 mike 100 lee//先插入數(shù)據(jù) zrange user:4 0 -1 withscores //返回結(jié)果如下圖 zrevrange user:4 0 -1 withscores ? //倒序,結(jié)果如下圖
返回指定分?jǐn)?shù)范圍的成員
返回指定分?jǐn)?shù)范圍的成員個(gè)數(shù):
zcount user:4 110 300 ?//返回2,由mike120和james200兩條數(shù)據(jù)統(tǒng)計(jì)成員數(shù)量
zcard test:1 ? ? //計(jì)算成員個(gè)數(shù), 返回1
4、有序集合交集
格式:
zinterstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]destination:交集產(chǎn)生新的元素存儲(chǔ)鍵名稱。
numkeys: 要做交集計(jì)算的鍵個(gè)數(shù),匹配不上會(huì)有語法錯(cuò)誤,會(huì)執(zhí)行不了。
key :元素鍵值。
weights:每個(gè)被選中的鍵對(duì)應(yīng)值乘weight, 默認(rèn)為1。
初始化數(shù)據(jù):
交集例子:
?zinterstore user_jj 2 user:7 user:8 aggregate sum //2代表鍵合并個(gè)數(shù), //aggregate sum可加也不可加上,因?yàn)槟J(rèn)是sum //結(jié)果user_jj:4james(1+3), 6mike(2+4)?zinterstore user_jjmax 2 user:7 user:8 aggregate max 或min? //取交集最大的分?jǐn)?shù),返回結(jié)果 3james ?4mike, min取最小weights的使用:
zinterstore user_jjweight 2 user:7 user:8 weights 8 4 aggregate max //1,取兩個(gè)成員相同的交集,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結(jié)果 8 james ?16 mike;? //3,將user:8-> james 3*4=12, user:8->mike 4*4=16,最后user:8結(jié)果12 james ?16 mike //4,最終相乘后的結(jié)果,取最大值為 ?12 james 16mike //5, zrange user_jjweight 0 -1 withscores 查詢結(jié)果為 ?12 james 16mike
5、有序集合并集(合并去重)
格式:
zunionstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]destination:交集產(chǎn)生新的元素存儲(chǔ)鍵名稱
numkeys: 要做交集計(jì)算的鍵個(gè)數(shù) key :元素鍵值
weights:每個(gè)被選中的鍵對(duì)應(yīng)值乘weight, 默認(rèn)為1
eg:
6、有序集合應(yīng)用場(chǎng)景
排行榜系統(tǒng),如視頻網(wǎng)站需要對(duì)用戶上傳的視頻做排行榜
點(diǎn)贊數(shù):
再獲一贊:
zincrby user:1:20180106 1 mike ?//在3的基礎(chǔ)上加1用戶作弊,將用戶從排行榜刪掉:
zrem user:1:20180106 mike展示贊數(shù)最多的5個(gè)用戶:
zrevrangebyrank user:1:20180106 ?0 ?4?查看用戶贊數(shù)與排名:
zscore user:1:20180106 mike ?? zrank user:1:20180106 mike
————————————————
版權(quán)聲明:本文為CSDN博主「lingengy」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/w1lgy/article/details/84377092
總結(jié)
以上是生活随笔為你收集整理的Redis系列六、redis的五种数据结构和相关指令之Sorted Set的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swagger 注解~用于方法
- 下一篇: linux cmake编译源码,linu