redis 常用命令,思維導圖 >>>
zset
是redis
提供的乙個非常特別的資料結構,常用作排行榜等功能,以使用者id
為value
,關注時間或者分數作為score
進行排序。與其他資料結構相似,zset
也有兩種不同的實現,分別是ziplist
和skiplist
zset 儲存示意圖:每個 value 後面都攜帶乙個分數,然後用作排序
跳表(skip list)是一種隨機化的資料結構,基於併聯的鍊錶,實現簡單,插入、刪除、查詢的複雜度均為o(logn)。簡單說來跳表也是鍊錶的一種,只不過它在鍊錶的基礎上增加了跳躍功能,正是這個跳躍的功能,使得在查詢元素時,跳表能夠提供o(logn)的時間複雜度。
看乙個有序鍊錶,如下圖(最左側的灰色節點表示乙個空的頭結點):
在這樣乙個鍊錶中,如果我們要查詢某個資料,那麼需要從頭開始逐個進行比較,直到找到包含資料的那個節點,或者找到第乙個比給定資料大的節點為止(沒找到)。也就是說,時間複雜度為o(n)。同樣,當我們要插入新資料的時候,也要經歷同樣的查詢過程,從而確定插入位置。
假如我們每相鄰兩個節點增加乙個指標,讓指標指向下下個節點,如下圖:
這樣所有新增加的指標連成了乙個新的鍊錶,但它包含的節點個數只有原來的一半。現在當我們想查詢資料的時候,可以先沿著這個新鍊錶進行查詢。當碰到比待查資料大的節點時,再回到原來的鍊錶中進行查詢。比如,我們想查詢23,查詢的路徑是沿著下圖中標紅的指標所指向的方向進行的:
資料結果
是否允許重複元素
是否有序
有序實現方式
應用場景
列表 list是是
索引下標
時間軸、訊息佇列
集合 set否否
無標籤、社交
有序集合 zset否是
分值排行榜,社交
redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重複。
使用場景:
1、根據時間排序的新聞列表等,
2、閱讀排行榜
--- 建立或設定指定key對應的有序集合,根據每個值對應的score來排名,公升序。例如有命令 zadd key1 10 a 20 b 30 d 40 c;那麼真實排名是 a b d c
zrem key member
--- 刪除指定key對應的集合中的member元素
zcard key
--- 返回指定key對應的有序集合的元素數量
zincrby key increment member
--- 將指定key對應的集合中的member元素對應的分值遞增加 increment
zcount key min max
--- 返回指定key對應的有序集合中,分值在min~max之間的元素個數
zrank key member
--- 返回指定key對應的有序集合中,指定元素member在集合中排名,從0開始切分值是從小到大公升序
zscore key member
--- 返回指定key中的集合中指定member元素對應的分值
zrange key min max [withscores]
--- 返回指定key對應的有序集合中,索引在min~max之間的元素資訊,如果帶上 withscores 屬性的話,可以將分值也帶出來
zrevrank key member
--- 返回指定key對應的集合中,指定member在其中的排名,注意排名從0開始且按照分值從大到小降序
zrevrange key start end [withscores]
--- 指定key對應的集合中,分值在 start~end之間的降序,加上 withscores 的話可以將分值以及value都顯示出來
zrangebyscore key start end [withscores]
--- 同 zrange命令不同的是,zrange命令是索引在startend範圍的查詢,而zrangebyscore命令是根據分值在startend之間的查詢且公升序展示
zrevrangebyscore key max min [withscores]
--- 同zrangebyscore命令不同的是,zrangebyscores是根據分值從小到大公升序展示,而zrevrangebyscore命令是從max到min降序展示
zremrangebyrank key start end
--- 移除指定key對應集合中索引在start~end之間(包括start和end本身)的元素
zremrangebyscore by min max
--- 同zremrangebyrank命令類似,不同的該命令是刪除分值在min~max之間的元素
zinterstore desk-key key-count key...
--- 獲取指定數量的key的交集。例如有 key1:,key2,那麼命令 zinterstore key3 2 key1 key2 意思就是 將key1 key2這兩個集合的交集 賦給key3,如何獲取key1與key2的交集呢。 key1中存在 a b c,key2中存在 b c d,那麼交集就是 b 和 c,且 b與c對應的score也會疊加,即 key3
zunionstore desk-key key-count key...
--- 獲取指定數量key的並集,例如有 key1,key2,可以看出 a和d不是key1與key2共有的,但是並集中只要存在就會記錄進去,然後b與c是共有的,即 並集的結果就是 key3
Redis資料型別 ZSET
1 zset為有序集合,其餘set非常類似,但是不同的是有序集合的每個成員都會關聯乙個評分,zest則通過這個評分的大小為集合中的成員進行排序 由低到高 集合的元素是唯一 的,但是評分卻可以重複。2 有序集合 支援新增 刪除 更新元素。由於有序性,可以很快根據評分獲取乙個範圍的元素。在有序集合中,你...
redis資料型別之ZSet
1 設定和獲取127.0 0.1 6379 zadd zset1 10 a zadd key score key integer 1127.0 0.1 6379 zadd zset1 50 b integer 1127.0 0.1 6379 zadd zset1 30 c integer 1127....
Redis資料型別之ZSet型別
有序集合 sorted set 1 redis 有序集合和集合一樣,也是string型別元素的集合,且不允許有重複的成員。2 不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。3 有序集合的成員是唯一的,但分數 score 卻可以重複。4 ...