日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis常用命令入门5:有序集合类型

發(fā)布時(shí)間:2025/3/15 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis常用命令入门5:有序集合类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有序集合類型

上節(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?member

ZRANK命令按照元素分?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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。