Redis中Zset類型常用命令的實(shí)現(xiàn)
一. Zset有序集合簡介.
定義: Zset(有序集合)是Redis中的一種數(shù)據(jù)類型,它保留了集合不能有重復(fù)成員的特點(diǎn),但與普通集合不同的是,Zset中的每個(gè)元素都與一個(gè)唯一的浮點(diǎn)類型的分?jǐn)?shù)(score)相關(guān)聯(lián),這使得Zset中的元素可以維護(hù)有序性。
如何保證有序性: 每個(gè)元素都與一個(gè)分?jǐn)?shù)相關(guān)聯(lián),分?jǐn)?shù)用于確定元素在集合中的位置,且分?jǐn)?shù)可以重復(fù)。當(dāng)分?jǐn)?shù)相同時(shí),元素會根據(jù)其字典順序進(jìn)行排序。
**Zset在Redis中底層的編碼方式:
- 壓縮列表(ziplist):一種緊湊的數(shù)據(jù)結(jié)構(gòu),通常用于存儲元素較少、元素較小的有序集合。它以連續(xù)的內(nèi)存塊形式存儲數(shù)據(jù),每個(gè)節(jié)點(diǎn)可以包含一個(gè)或多個(gè)元素,且可以非常緊湊地存儲整數(shù)和字符串等不同類型的元素。
- 跳躍表(skiplist):一種基于鏈表的數(shù)據(jù)結(jié)構(gòu),通常用于存儲元素較多、元素較大的有序集合。跳躍表通過多層鏈表實(shí)現(xiàn)快速查找,其插入、刪除、查找的時(shí)間復(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不存在的時(shí)候才會添加對應(yīng)的score-number
- XX: 當(dāng)number存在的時(shí)候才會修改對應(yīng)的score-number
- GT: 當(dāng)更新元素的時(shí)候, 只有當(dāng)給定的score比已有的score大, 才會更新成功.
- LT: 當(dāng)更新元素的時(shí)候, 只有當(dāng)給定的score比已有的score小, 才會更新成功.
- CH: 將返回值從添加的新元素?cái)?shù)修改為更改的元素總數(shù)(CH是changed的縮寫)。更改的元素是添加的新元素和已經(jīng)存在的元素,并為其更新了分?jǐn)?shù)。因此,在命令行中指定的具有與過去相同分?jǐn)?shù)的元素不會被計(jì)算在內(nèi)。注意:通常ZADD的返回值只計(jì)算添加的新元素的數(shù)量
- INCR:當(dāng)指定這個(gè)選項(xiàng)時(shí),ZADD的行為類似于ZINCRBY。在這種模式下只能指定一個(gè)分?jǐn)?shù)-元素對
時(shí)間復(fù)雜度:
O(log(N)),其中N是排序集合中元素的個(gè)數(shù)。
演示命令的使用:



三. 查詢元素相關(guān)操作.
3.1 查詢有序集合中的元素個(gè)數(shù)( zcard zcount)
命令基本格式:
ZCARD keyZCOUNT key min max
時(shí)間復(fù)雜度:
zcard O(1)zcount O(log(N)) N是排序集合中元素的個(gè)數(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的效果類似
時(shí)間復(fù)雜度:
zrange O(log(N)+M),其中N是排序集合中的元素個(gè)數(shù),M是返回的元素個(gè)數(shù)。zrevrange O(log(N)+M),其中N是排序集合中的元素個(gè)數(shù),M是返回的元素個(gè)數(shù)。zrangebyscore O(log(N)+M)其中N是排序集合中的元素個(gè)數(shù)M是返回的元素個(gè)數(shù)。如果M是常數(shù)(例如總是要求前10個(gè)元素有LIMIT),你可以認(rèn)為它是O(log(N))。
演示命令的使用:

3.3 查詢有序集合中指定成員的排名(zrank zrevrank )
命令基本格式:
ZRANK key member [WITHSCORE] 查詢有序集合中指定成員的排名ZREVRANK key member [WITHSCORE] 查詢有序集合中指定成員的逆序排名
時(shí)間復(fù)雜度:
O(log(N))
演示命令的使用:

3.4 查詢有序集合中指定成員的分?jǐn)?shù)(zscore)
命令基本格式:
ZSCORE key member查詢有序集合中指定成員的分?jǐn)?shù)
時(shí)間復(fù)雜度:
O(1)
演示命令的使用:

四. 刪除元素相關(guān)操作.
4.1 刪除并返回最大/最小的n個(gè)元素(zpopmax zpopmin)
命令基本格式:
ZPOPMAX key [count] 刪除并返回最大的n個(gè)元素ZPOPMIN key [count] 刪除并返回最小的n個(gè)元素
時(shí)間復(fù)雜度:
都是 O(log(N)*M)其中N是排序集合中的元素個(gè)數(shù),M是彈出的元素個(gè)數(shù)。
演示命令的使用:

4.2 帶有阻塞性質(zhì)刪除最大/小元素(bzpopmin bzpopmax)
命令基本格式:
BZPOPMAX key [key ...] timeoutBZPOPMIN key [key ...] timeout
時(shí)間復(fù)雜度:
O(log(N)) N是排序集合中元素的個(gè)數(shù)O(log(N)) N是排序集合中元素的個(gè)數(shù)
演示命令的使用:


4.3 刪除有序集合中的n個(gè)元素( zrem zremrangebyrank zremrangebyscore)
命令基本格式:
ZREM key member [member ...] 刪除有序集合中的n個(gè)元素ZREMRANGEBYRANK key start stop 刪除有序集合中指定排名范圍內(nèi)的成員ZREMRANGEBYSCORE key min max 刪除有序集合中指定分?jǐn)?shù)范圍內(nèi)的成員
時(shí)間復(fù)雜度:
zrem O(M*log(N)),其中N是排序集合中元素的個(gè)數(shù),M是要移除的元素的個(gè)數(shù)
zremrangebyrank O(log(N)+M),其中N是排序集合中的元素個(gè)數(shù),M是操作移除的元素個(gè)數(shù)
zremrangebyscore O(log(N)+M),其中N是排序集合中的元素個(gè)數(shù),M是操作移除的元素個(gè)數(shù)。
演示命令的使用:

五. 集合運(yùn)算相關(guān)操作.
5.1 求有序集合交集的操作(zinterstore)
命令基本格式:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
解釋參數(shù)含義:
- destination 要把求交集的結(jié)果存儲到哪個(gè)key對應(yīng)的zset之中.
- numkeys 描述了后續(xù)有幾個(gè)key參與交集運(yùn)算.
- weight 每個(gè)key對應(yīng)的權(quán)重
時(shí)間復(fù)雜度:
O(N*K)+O(M*log(M))最壞情況,其中N是最小的輸入排序集,K是輸入排序集的個(gè)數(shù),M是結(jié)果排序集中元素的個(gè)數(shù)。
5.2 求集合并集的操作(zunionstore)
命令基本格式:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
時(shí)間復(fù)雜度:
O(N)+O(M log(M)),其中N是輸入排序集的大小之和,M是結(jié)果排序集的元素個(gè)數(shù)。
演示命令的使用:

到此這篇關(guān)于Redis中Zset類型常用命令的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis Zset命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis SETEX命令實(shí)現(xiàn)鍵值對管理
本文主要介紹了Redis SETEX命令實(shí)現(xiàn)鍵值對管理,SETEX命令用于設(shè)置具有過期時(shí)間的鍵值對,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
在Windows系統(tǒng)上部署Redis的多種解決方案
本文詳細(xì)介紹了在Windows上部署Redis的方法,包括選擇版本與資源、環(huán)境準(zhǔn)備、核心部署實(shí)戰(zhàn)、核心配置文件詳解、遠(yuǎn)程連接與防火墻設(shè)置等內(nèi)容,文章還推薦了幾款適合的可視化客戶端,并簡要介紹了替代部署方案,需要的朋友可以參考下2026-05-05
RediSearch加RedisJSON大于Elasticsearch的搜索存儲引擎
這篇文章主要為大家介紹了RediSearch加RedisJSON大于Elasticsearch的王炸使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Redis報(bào)錯(cuò)UnrecognizedPropertyException: Unrecognized 
在使用SpringBoot訪問Redis時(shí),報(bào)錯(cuò)提示識別不了屬性headPart,經(jīng)過排查,發(fā)現(xiàn)并非Serializable或getset方法問題,而是存在一個(gè)方法getHeadPart,但無headPart屬性,解決方案是將getHeadPart改為makeHeadPart2024-10-10

