Redis常用命令入门5:有序集合类型
有序集合類型
上節(jié)我們一起學(xué)習(xí)了集合類型,感受到了redis的強(qiáng)大。現(xiàn)在我們接著學(xué)Redis的最后一個(gè)類型——有序集合類型。
有序集合類型,大家從名字上應(yīng)該就可以知道,實(shí)際上就是在集合類型上加了個(gè)有序而已。Redis中的有序集合類型,實(shí)際上是在集合類型上,為每個(gè)元素都關(guān)聯(lián)一個(gè)分?jǐn)?shù),有序?qū)嶋H上說的是分?jǐn)?shù)有序,我們根據(jù)分?jǐn)?shù)的范圍獲取集合及其他操作。集合的元素依然是不能夠相同的,但是分?jǐn)?shù)可以相同。
下面列舉有序集合和類型和列表類型的相似處:
①兩者都是有序的(廢話!)
②兩者都可以獲得某一范圍的元素
下面列舉區(qū)別:
①列表是鏈表實(shí)現(xiàn)的,靠近兩邊的數(shù)據(jù)讀取極快,而元素過多后獲取中間元素的速度則會(huì)很慢;有序集合類型使用的散列表和跳躍表(Skip list)實(shí)現(xiàn)的,所以讀取哪部分的數(shù)據(jù)都差不多(時(shí)間復(fù)雜度是O(logN))。
②列表中不能簡單的調(diào)整元素的位置,但是有序集合可以(通過改變分?jǐn)?shù))。
③有序集合比列表費(fèi)內(nèi)存(要存儲(chǔ)分?jǐn)?shù)、散列、跳躍表)。
下面我們來一起學(xué)習(xí)命令(這里參數(shù)關(guān)鍵字都比較多,所以下面開始列舉的命令,關(guān)鍵字都使用大寫)。
1、增加元素
ZADD key score member [score member ...]ZADD命令是向集合中增加元素的命令,往集合中增加分?jǐn)?shù)為score的member,這里也是可以一次增加多個(gè)值,返回值是成功增加的元素的個(gè)數(shù),如果member存在,則score會(huì)覆蓋原有的分?jǐn)?shù)。
127.0.0.1:6379> zadd scoreboard 89 tom (integer) 1 //添加一個(gè) 127.0.0.1:6379> zadd scoreboard 70 peter 100 david (integer) 2 //添加多個(gè) 127.0.0.1:6379> zrange scoreboard 0 -1 withscores 1) "peter" //帶分?jǐn)?shù)輸出 2) "70" 3) "tom" 4) "89" 5) "david" 6) "100"我們發(fā)現(xiàn)Peter的分?jǐn)?shù)錄入錯(cuò)了,需要修改為76分,這時(shí)候我們接著執(zhí)行下面的命令。
127.0.0.1:6379> zadd scoreboard 76 peter (integer) 0 //member存在時(shí),score不一致,會(huì)修改score 127.0.0.1:6379> zrange scoreboard 0 -1 withscores 1) "peter" 2) "76" //70->76 3) "tom" 4) "89" 5) "david" 6) "100"這里分?jǐn)?shù)不僅僅支持整數(shù),還支持浮點(diǎn)數(shù)。
127.0.0.1:6379> zadd testscore 17e+307 A (integer) 1 127.0.0.1:6379> zadd testscore 3.3 B (integer) 1 127.0.0.1:6379> zadd testscore -inf D (integer) 1 127.0.0.1:6379> zadd testscore +inf C (integer) 1 127.0.0.1:6379> zrange testscore 0 -1 withscores 1) "D" 2) "-inf" 3) "B" 4) "3.2999999999999998" 5) "A" 6) "1.6999999999999999e+308" 7) "C" 8) "inf"其中+inf和-inf是正負(fù)無窮的意思。
2、獲得元素的分?jǐn)?shù)
?ZSCORE?key?member 127.0.0.1:6379> zscore scoreboard peter "76"?
3、獲得排名在某個(gè)范圍的元素列表
ZRANGE?key?start?stop?[WITHSCORE] ZREVRANGE?key?start?stop?[WITHSCORE]ZRANGE命令會(huì)按照元素分?jǐn)?shù)的從小到大順序返回索引從start到stop之間所有的元素(包含兩端)。ZRANGE與LRANGE命令相似,索引從0開始,負(fù)數(shù)一樣代表從后向前查找(-1是最后一個(gè))。WITHSCORE代表是否加上分?jǐn)?shù)。
127.0.0.1:6379> zrange scoreboard 0 2 1) "peter" 2) "tom" 3) "david" 127.0.0.1:6379> zrange scoreboard 0 -1 withscores 1) "peter" 2) "76" 3) "tom" 4) "89" 5) "david" 6) "100" 127.0.0.1:6379> zrevrange scoreboard 0 -1 withscores 1) "david" 2) "100" 3) "tom" 4) "89" 5) "peter" 6) "76"ZRANGE命令的時(shí)間復(fù)雜度為O(longN+m),其中n為有序集合的基數(shù),m為返回的元素個(gè)數(shù)。如果遇到分?jǐn)?shù)相同的情況,Redis會(huì)按照字典順序(即”0″<…<”9″<”A”<…<”Z”<”a”<…<”z”這樣的順序)進(jìn)行排列。如果是中文,也會(huì)按照編碼之后的字典順序排序。
ZREVRANGE命令和ZRANGE命令唯一不同的是ZREVRANGE命令是按照分數(shù)從大到小給出順序結(jié)果。
4、獲得指定分?jǐn)?shù)范圍的元素
ZRANGEBYSCORE?key?min?max?[WITHSCORES]?[LIMIT?offset?count]這個(gè)命令參數(shù)很多,但是都很好理解。這個(gè)命令用來獲取指定分?jǐn)?shù)范圍的元素,min是最小值,max是最大值,WITHSCORE還是和上面介紹的一樣,LIMIT是為了指定偏移量及數(shù)量的,和sql的有點(diǎn)像。offset是偏移量,count是數(shù)量。同時(shí)這些min和max都是包含的,如果要想不包含,需要使用“(”符號(hào)。
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores 1) "tom" 2) "89" 3) "david" 4) "100" 127.0.0.1:6379> zrangebyscore scoreboard (80 100 withscores 1) "tom" 2) "89" 3) "david" 4) "100" 127.0.0.1:6379> zrangebyscore scoreboard 80 (100 withscores 1) "tom" 2) "89" 127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 1 1) "david" 2) "100" 127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 2 1) "david" 2) "100" 127.0.0.1:6379> zrangebyscore scoreboard 60 +inf withscores 1) "peter" 2) "76" 3) "tom" 4) "89" 5) "david" 6) "100"?5、增加某個(gè)元素的分?jǐn)?shù)
ZINCRBY?key?incremnet?member 127.0.0.1:6379> ZINCRBY scoreboard 2 peter "78"127.0.0.1:6379> ZINCRBY scoreboard -5 peter "73"
這個(gè)命令可以增加一個(gè)元素的分?jǐn)?shù),返回值是更改后的分?jǐn)?shù)。這里就不再贅述用法了,和INCRBY命令類似。同樣如果不存在會(huì)初始為0在增加,負(fù)數(shù)即是減小。
6、獲得集合中元素的數(shù)量
ZCARD?key這個(gè)命令和SCARD類似,也就不多說了。
7、獲得指定分?jǐn)?shù)范圍的元素個(gè)數(shù)
ZCOUNT?key?min?max這里就是獲得min和max分?jǐn)?shù)之間的元素?cái)?shù),當(dāng)然這里也支持“(”符號(hào)。
8、刪除一個(gè)或多個(gè)元素
ZREM?key?member?[member?...]返回值是成功刪除的元素的個(gè)數(shù)。
127.0.0.1:6379> zrem scoreboard peter (integer) 1 127.0.0.1:6379> zrange scoreboard 0 -1 1) "tom" 2) "david"9、按照排名范圍刪除元素
ZREMRANGEBYRANK?key?start?stop這個(gè)命令按照元素分?jǐn)?shù)從小到大順序刪除指定范圍內(nèi)所有的元素(其實(shí)就是先排序,然后按照排好的序列的索引刪除),并返回刪除的元素的數(shù)量。
10、按照分?jǐn)?shù)范圍刪除元素
ZREMRANGEBYSCORE?key?min?max這里就是直接刪除分?jǐn)?shù)范圍的元素了,這里分?jǐn)?shù)同樣支持“(”符號(hào),返回刪除數(shù)量。
11、獲得元素的排名
ZRANK?key?member ZREVRANK?key?memberZRANK命令按照元素分?jǐn)?shù)的從小到大的順序獲得制定元素的排名(第一個(gè)從0開始),ZREVRANK則相反。
127.0.0.1:6379> zrank scoreboard tom (integer) 0 127.0.0.1:6379> zrank scoreboard david (integer) 1?
最后我們舉個(gè)實(shí)際應(yīng)用的例子。
我們把wordpress的文章按點(diǎn)擊率排序,關(guān)系數(shù)據(jù)庫我們是遍歷所有的文章排序點(diǎn)擊數(shù),如果使用Redis,我們需要一個(gè)posts:page.view鍵的有序集合類型,然后每個(gè)member為文章ID,score為文章的點(diǎn)擊量。這樣我們就可以用ZREVRANGE命令獲取點(diǎn)擊量排行榜。
還有一個(gè)實(shí)際的例子,我們用有序集合類型保存文章的發(fā)布時(shí)間(時(shí)間用UNIX時(shí)間及時(shí)間的毫秒數(shù))與文章ID,這樣我們可以很方便的按時(shí)間來查看文章列表,我們的文章列表應(yīng)該是用文章發(fā)布時(shí)間排序而不應(yīng)該用文章ID排序的。
轉(zhuǎn)載于:https://www.cnblogs.com/Joans/p/5807366.html
總結(jié)
以上是生活随笔為你收集整理的Redis常用命令入门5:有序集合类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper C 同步 API 介
- 下一篇: MongoDB学习笔记——数据库安装及配