Redis中Zset類型常用命令的實現(xiàn)
一. Zset有序集合簡介.
定義: Zset(有序集合)是Redis中的一種數(shù)據(jù)類型,它保留了集合不能有重復(fù)成員的特點,但與普通集合不同的是,Zset中的每個元素都與一個唯一的浮點類型的分?jǐn)?shù)(score)相關(guān)聯(lián),這使得Zset中的元素可以維護(hù)有序性。
如何保證有序性: 每個元素都與一個分?jǐn)?shù)相關(guān)聯(lián),分?jǐn)?shù)用于確定元素在集合中的位置,且分?jǐn)?shù)可以重復(fù)。當(dāng)分?jǐn)?shù)相同時,元素會根據(jù)其字典順序進(jìn)行排序。
**Zset在Redis中底層的編碼方式:
- 壓縮列表(ziplist):一種緊湊的數(shù)據(jù)結(jié)構(gòu),通常用于存儲元素較少、元素較小的有序集合。它以連續(xù)的內(nèi)存塊形式存儲數(shù)據(jù),每個節(jié)點可以包含一個或多個元素,且可以非常緊湊地存儲整數(shù)和字符串等不同類型的元素。
- 跳躍表(skiplist):一種基于鏈表的數(shù)據(jù)結(jié)構(gòu),通常用于存儲元素較多、元素較大的有序集合。跳躍表通過多層鏈表實現(xiàn)快速查找,其插入、刪除、查找的時間復(fù)雜度均為O(logN)。
二. 添加元素相關(guān)命令.
2.1 向有序集合中添加元素(zadd)
- 命令基本格式:
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
解釋參數(shù)含義:
- NX: 當(dāng)number不存在的時候才會添加對應(yīng)的score-number
- XX: 當(dāng)number存在的時候才會修改對應(yīng)的score-number
- GT: 當(dāng)更新元素的時候, 只有當(dāng)給定的score比已有的score大, 才會更新成功.
- LT: 當(dāng)更新元素的時候, 只有當(dāng)給定的score比已有的score小, 才會更新成功.
- CH: 將返回值從添加的新元素數(shù)修改為更改的元素總數(shù)(CH是changed的縮寫)。更改的元素是添加的新元素和已經(jīng)存在的元素,并為其更新了分?jǐn)?shù)。因此,在命令行中指定的具有與過去相同分?jǐn)?shù)的元素不會被計算在內(nèi)。注意:通常ZADD的返回值只計算添加的新元素的數(shù)量
- INCR:當(dāng)指定這個選項時,ZADD的行為類似于ZINCRBY。在這種模式下只能指定一個分?jǐn)?shù)-元素對
時間復(fù)雜度:
O(log(N)),其中N是排序集合中元素的個數(shù)。
演示命令的使用:
三. 查詢元素相關(guān)操作.
3.1 查詢有序集合中的元素個數(shù)( zcard zcount)
命令基本格式:
ZCARD key
ZCOUNT key min max
時間復(fù)雜度:
zcard O(1)
zcount O(log(N)) N是排序集合中元素的個數(shù)。
演示命令的使用:
3.2 查詢指定區(qū)間內(nèi)的元素(zrange zrevrange zrangebyscore)
命令基本格式:
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
獲取指定下標(biāo)范圍內(nèi)的元素ZREVRANGE key start stop [WITHSCORES]
逆序獲取指定下標(biāo)范圍內(nèi)的元素ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
按照分?jǐn)?shù)來找元素,和zcount的效果類似
時間復(fù)雜度:
zrange O(log(N)+M)
,其中N是排序集合中的元素個數(shù),M是返回的元素個數(shù)。zrevrange O(log(N)+M)
,其中N是排序集合中的元素個數(shù),M是返回的元素個數(shù)。zrangebyscore O(log(N)+M)
其中N是排序集合中的元素個數(shù)M是返回的元素個數(shù)。如果M是常數(shù)(例如總是要求前10個元素有LIMIT),你可以認(rèn)為它是O(log(N))。
演示命令的使用:
3.3 查詢有序集合中指定成員的排名(zrank zrevrank )
命令基本格式:
ZRANK key member [WITHSCORE]
查詢有序集合中指定成員的排名ZREVRANK key member [WITHSCORE]
查詢有序集合中指定成員的逆序排名
時間復(fù)雜度:
O(log(N))
演示命令的使用:
3.4 查詢有序集合中指定成員的分?jǐn)?shù)(zscore)
命令基本格式:
ZSCORE key member
查詢有序集合中指定成員的分?jǐn)?shù)
時間復(fù)雜度:
O(1)
演示命令的使用:
四. 刪除元素相關(guān)操作.
4.1 刪除并返回最大/最小的n個元素(zpopmax zpopmin)
命令基本格式:
ZPOPMAX key [count]
刪除并返回最大的n個元素ZPOPMIN key [count]
刪除并返回最小的n個元素
時間復(fù)雜度:
都是 O(log(N)*M)其中N是排序集合中的元素個數(shù),M是彈出的元素個數(shù)。
演示命令的使用:
4.2 帶有阻塞性質(zhì)刪除最大/小元素(bzpopmin bzpopmax)
命令基本格式:
BZPOPMAX key [key ...] timeout
BZPOPMIN key [key ...] timeout
時間復(fù)雜度:
O(log(N))
N是排序集合中元素的個數(shù)O(log(N)) N是排序集合中元素的個數(shù)
演示命令的使用:
4.3 刪除有序集合中的n個元素( zrem zremrangebyrank zremrangebyscore)
命令基本格式:
ZREM key member [member ...]
刪除有序集合中的n個元素ZREMRANGEBYRANK key start stop
刪除有序集合中指定排名范圍內(nèi)的成員ZREMRANGEBYSCORE key min max
刪除有序集合中指定分?jǐn)?shù)范圍內(nèi)的成員
時間復(fù)雜度:
zrem O(M*log(N))
,其中N是排序集合中元素的個數(shù),M是要移除的元素的個數(shù)
zremrangebyrank O(log(N)+M)
,其中N是排序集合中的元素個數(shù),M是操作移除的元素個數(shù)
zremrangebyscore O(log(N)+M)
,其中N是排序集合中的元素個數(shù),M是操作移除的元素個數(shù)。
演示命令的使用:
五. 集合運算相關(guān)操作.
5.1 求有序集合交集的操作(zinterstore)
命令基本格式:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
解釋參數(shù)含義:
- destination 要把求交集的結(jié)果存儲到哪個key對應(yīng)的zset之中.
- numkeys 描述了后續(xù)有幾個key參與交集運算.
- weight 每個key對應(yīng)的權(quán)重
時間復(fù)雜度:
O(N*K)+O(M*log(M))
最壞情況,其中N是最小的輸入排序集,K是輸入排序集的個數(shù),M是結(jié)果排序集中元素的個數(shù)。
5.2 求集合并集的操作(zunionstore)
命令基本格式:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
時間復(fù)雜度:
O(N)+O(M log(M))
,其中N是輸入排序集的大小之和,M是結(jié)果排序集的元素個數(shù)。
演示命令的使用:
到此這篇關(guān)于Redis中Zset類型常用命令的實現(xiàn)的文章就介紹到這了,更多相關(guān)Redis Zset命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis整合SpringBoot的RedisTemplate實現(xiàn)類(實例詳解)
這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實現(xiàn)類,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案
兩級緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下2024-12-12Redis?RESP?協(xié)議實現(xiàn)實例詳解
這篇文章主要為大家介紹了Redis?RESP?協(xié)議實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09redis數(shù)據(jù)一致性的實現(xiàn)示例
所謂的redis數(shù)據(jù)一致性即當(dāng)進(jìn)行修改或者保存、刪除之后,redis中的數(shù)據(jù)也應(yīng)該進(jìn)行相應(yīng)變化,本文主要介紹了redis數(shù)據(jù)一致性,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03