Redis中Zset類型常用命令的實(shí)現(xiàn)
一. Zset有序集合簡(jiǎn)介.
定義: 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í),元素會(huì)根據(jù)其字典順序進(jìn)行排序。
**Zset在Redis中底層的編碼方式:
- 壓縮列表(ziplist):一種緊湊的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)元素較少、元素較小的有序集合。它以連續(xù)的內(nèi)存塊形式存儲(chǔ)數(shù)據(jù),每個(gè)節(jié)點(diǎn)可以包含一個(gè)或多個(gè)元素,且可以非常緊湊地存儲(chǔ)整數(shù)和字符串等不同類型的元素。
- 跳躍表(skiplist):一種基于鏈表的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)元素較多、元素較大的有序集合。跳躍表通過多層鏈表實(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í)候才會(huì)添加對(duì)應(yīng)的score-number
- XX: 當(dāng)number存在的時(shí)候才會(huì)修改對(duì)應(yīng)的score-number
- GT: 當(dāng)更新元素的時(shí)候, 只有當(dāng)給定的score比已有的score大, 才會(huì)更新成功.
- LT: 當(dāng)更新元素的時(shí)候, 只有當(dāng)給定的score比已有的score小, 才會(huì)更新成功.
- CH: 將返回值從添加的新元素?cái)?shù)修改為更改的元素總數(shù)(CH是changed的縮寫)。更改的元素是添加的新元素和已經(jīng)存在的元素,并為其更新了分?jǐn)?shù)。因此,在命令行中指定的具有與過去相同分?jǐn)?shù)的元素不會(huì)被計(jì)算在內(nèi)。注意:通常ZADD的返回值只計(jì)算添加的新元素的數(shù)量
- INCR:當(dāng)指定這個(gè)選項(xiàng)時(shí),ZADD的行為類似于ZINCRBY。在這種模式下只能指定一個(gè)分?jǐn)?shù)-元素對(duì)
時(shí)間復(fù)雜度:
O(log(N)),其中N是排序集合中元素的個(gè)數(shù)。
演示命令的使用:
三. 查詢?cè)叵嚓P(guān)操作.
3.1 查詢有序集合中的元素個(gè)數(shù)( zcard zcount)
命令基本格式:
ZCARD key
ZCOUNT 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 ...] timeout
BZPOPMIN 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é)果存儲(chǔ)到哪個(gè)key對(duì)應(yīng)的zset之中.
- numkeys 描述了后續(xù)有幾個(gè)key參與交集運(yùn)算.
- weight 每個(gè)key對(duì)應(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類(實(shí)例詳解)
這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案
兩級(jí)緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會(huì)出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會(huì)導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下2024-12-12Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09redis數(shù)據(jù)一致性的實(shí)現(xiàn)示例
所謂的redis數(shù)據(jù)一致性即當(dāng)進(jìn)行修改或者保存、刪除之后,redis中的數(shù)據(jù)也應(yīng)該進(jìn)行相應(yīng)變化,本文主要介紹了redis數(shù)據(jù)一致性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03