Redis?SortedSet數(shù)據(jù)類型及其常用命令總結(jié)
一、Redis概述
SortedSet類型
- Redis的SortedSet是一個(gè)可排序的set集合,與Java中的TreeSet有些類似,但底層數(shù)據(jù)結(jié)構(gòu)卻差別很大。
- SortedSet中的每一個(gè)元素都帶有一個(gè)score屬性,可以基于score屬性對(duì)元素排序,底層的實(shí)現(xiàn)是一個(gè)跳表(
SkipList
)加 hash表。 - 數(shù)據(jù)結(jié)構(gòu)——跳表詳解
SortedSet具備下列特性:
- 可排序
- 元素不重復(fù)
- 查詢速度快
因?yàn)镾ortedSet的可排序特性,經(jīng)常被用來(lái)實(shí)現(xiàn)排行榜這樣的功能。
1 ZADD:向有序集合添加成員
添加一個(gè)或多個(gè)元素到sorted set ,如果已經(jīng)存在則更新其score值
ZADD
是 Redis 中用于向有序集合添加成員的命令。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
key
: 有序集合的鍵名。NX
或XX
(可選):用于指定操作的條件,NX
表示只在成員不存在時(shí)才添加,XX
表示只在成員已經(jīng)存在時(shí)才添加。GT
或LT
(可選):用于指定操作的條件,GT
表示只添加比給定分?jǐn)?shù)大的成員,LT
表示只添加比給定分?jǐn)?shù)小的成員。CH
(可選):表示將返回值設(shè)置為新增成員的數(shù)量,即使是更新已經(jīng)存在成員的分?jǐn)?shù)。INCR
(可選):表示將成員的分?jǐn)?shù)與給定的增量相加,而不是將成員的分?jǐn)?shù)設(shè)置為給定的值。score member [score member ...]
: 分?jǐn)?shù)和成員組成的列表,可以一次性添加多個(gè)成員。
返回值
- 返回值為整數(shù),表示添加的成員數(shù)量,不包括已經(jīng)存在并且分?jǐn)?shù)被更新的成員。
行為說(shuō)明
- 將一個(gè)或多個(gè)成員添加到有序集合中,或者更新已經(jīng)存在成員的分?jǐn)?shù)。
- 如果有序集合不存在,將會(huì)創(chuàng)建一個(gè)新的有序集合并添加成員。
- 如果成員已經(jīng)存在于有序集合中,它的分?jǐn)?shù)將被更新。
示例
- 向有序集合
zset1
中添加成員member1
和member2
,并指定分?jǐn)?shù):
ZADD zset1 10 member1 20 member2
執(zhí)行后:
- 如果
zset1
不存在,將會(huì)被創(chuàng)建并添加成員。 - 如果
member1
不存在,則添加member1
到zset1
并設(shè)置分?jǐn)?shù)為10
。 - 如果
member2
不存在,則添加member2
到zset1
并設(shè)置分?jǐn)?shù)為20
。 - 返回值為添加的成員數(shù)量,這里是
2
。
使用場(chǎng)景
- 排行榜:用于存儲(chǔ)和更新排行榜中的成員和分?jǐn)?shù)。
- 數(shù)據(jù)排序:在需要對(duì)數(shù)據(jù)進(jìn)行排序和檢索時(shí)使用。
2 ZREM:從有序集合中移除一個(gè)或多個(gè)成員
ZREM
是 Redis 中用于從有序集合中移除一個(gè)或多個(gè)成員的命令。
ZREM key member [member ...]
key
: 有序集合的鍵名。member
: 要從有序集合中移除的成員。
返回值
- 返回整數(shù)值,表示被成功移除的成員數(shù)量。
行為說(shuō)明
- 從有序集合中移除給定的成員,如果成員不存在于有序集合中,則忽略。
- 如果有序集合在移除成員后變?yōu)榭占?,將自?dòng)刪除該有序集合的鍵。
示例
有序集合 zset1
,其中包含成員 member1
、member2
和 member3
:
ZADD zset1 10 member1 20 member2 30 member3
從有序集合 zset1
中移除成員 member2
:
ZREM zset1 member2
執(zhí)行后:
zset1
中將只剩下成員member1
和member3
。- 返回值為
1
,表示成功移除了一個(gè)成員。
嘗試移除不存在的成員 member4
:
ZREM zset1 member4
執(zhí)行后:
zset1
保持不變,因?yàn)槌蓡Tmember4
不存在。- 返回值為
0
,表示沒(méi)有移除任何成員。
注意事項(xiàng)
ZREM
命令是原子的,這意味著在命令執(zhí)行過(guò)程中不會(huì)有其他客戶端能夠?qū)υ撚行蚣线M(jìn)行操作。- 如果有序集合在移除成員后變?yōu)榭占?,將自?dòng)刪除該有序集合的鍵。
3 ZSCORE : 獲取sorted set中的指定元素的score值
ZSCORE
是 Redis 中用于獲取有序集合中指定成員的分?jǐn)?shù)的命令。
ZSCORE key member
key
: 有序集合的鍵名。member
: 要查詢分?jǐn)?shù)的成員。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZSCORE myzset "one" "1"
返回字符串形式的成員分?jǐn)?shù)。如果成員不存在于有序集合中,則返回 nil
。
行為說(shuō)明
- 查詢并返回有序集合中指定成員的分?jǐn)?shù)。
- 如果有序集合或成員不存在,將返回
nil
。
示例
有序集合 zset1
,其中包含成員 member1
、member2
和 member3
,其分?jǐn)?shù)分別為 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查詢 member2
的分?jǐn)?shù):
ZSCORE zset1 member2
執(zhí)行后:
- 返回值為
"20"
,表示member2
的分?jǐn)?shù)是20
。
查詢不存在的成員 member4
的分?jǐn)?shù):
ZSCORE zset1 member4
執(zhí)行后:
返回值為 nil
,因?yàn)?member4
不存在于 zset1
中。
注意事項(xiàng)
ZSCORE
命令是只讀的,不會(huì)修改有序集合的內(nèi)容。返回值是字符串形式的分?jǐn)?shù),即使實(shí)際分?jǐn)?shù)是一個(gè)整數(shù)。
4 ZRANK:獲取sorted set 中的指定元素的排名
ZRANK
是 Redis 中用于獲取有序集合中指定成員的排名(索引)的命令。
ZRANK key member [WITHSCORE]
key
: 有序集合的鍵名。member
: 要查詢排名的成員。WITHSCORE
: 可選參數(shù),如果指定了WITHSCORE
,則返回成員的排名和分?jǐn)?shù)。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZADD myzset 3 "three" (integer) 1 redis> ZRANK myzset "three" (integer) 2 redis> ZRANK myzset "four" (nil) redis> ZRANK myzset "three" WITHSCORE 1) (integer) 2 2) "3" redis> ZRANK myzset "four" WITHSCORE (nil)
如果成員存在于有序集合中,返回成員的排名(從 0 開(kāi)始)。如果成員不存在于有序集合中,返回 nil
。
如果指定了 WITHSCORE
參數(shù),返回值將是一個(gè)包含排名和分?jǐn)?shù)的數(shù)組:[排名, 分?jǐn)?shù)]。
行為說(shuō)明
- 查詢并返回有序集合中指定成員的排名。
- 如果有序集合中存在多個(gè)相同分?jǐn)?shù)的成員,排名按照成員的字典順序進(jìn)行排序。
示例
有序集合 zset1
,其中包含成員 member1
、member2
和 member3
,其分?jǐn)?shù)分別為 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查詢 member2
的排名:
ZRANK zset1 member2
執(zhí)行后:
返回值為 1
,表示 member2
在有序集合中的排名是第二位(索引從 0 開(kāi)始)。
查詢 member4
的排名:
ZRANK zset1 member4
執(zhí)行后:
- 返回值為
nil
,因?yàn)?member4
不存在于zset1
中。
使用 WITHSCORE
參數(shù)查詢 member2
的排名和分?jǐn)?shù):
ZRANK zset1 member2 WITHSCORE
執(zhí)行后:
- 返回值為
["1", "20"]
,表示member2
的排名是第二位,分?jǐn)?shù)是20
。
注意事項(xiàng)
ZRANK
命令只讀,不會(huì)修改有序集合的內(nèi)容。如果有序集合中存在多個(gè)相同分?jǐn)?shù)的成員,排名將按照成員的字典順序進(jìn)行排序。
5 ZCARD:獲取sorted set中的元素個(gè)數(shù)
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZCARD myzset (integer) 2
6 ZCOUNT:統(tǒng)計(jì)score值在給定范圍內(nèi)的所有元素的個(gè)數(shù)
ZCOUNT
是 Redis 中用于獲取有序集合中指定分?jǐn)?shù)范圍內(nèi)的成員數(shù)量的命令。
ZCOUNT key min max
key
: 有序集合的鍵名。min
: 分?jǐn)?shù)范圍的下限。max
: 分?jǐn)?shù)范圍的上限。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZADD myzset 3 "three" (integer) 1 redis> ZCOUNT myzset -inf +inf (integer) 3 redis> ZCOUNT myzset (1 3 (integer) 2
返回指定分?jǐn)?shù)范圍內(nèi)的成員數(shù)量。
行為說(shuō)明
- 查詢并返回有序集合中分?jǐn)?shù)在給定范圍內(nèi)的成員數(shù)量,包括邊界的成員。
示例
有序集合 zset1
,其中包含成員 member1
、member2
和 member3
,其分?jǐn)?shù)分別為 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查詢分?jǐn)?shù)在 [15, 25]
范圍內(nèi)的成員數(shù)量:
ZCOUNT zset1 15 25
執(zhí)行后:
假設(shè)有序集合中沒(méi)有相同分?jǐn)?shù)的成員,返回值將是 1
,因?yàn)橹挥?member2
的分?jǐn)?shù)在 15
到 25
之間。
7 ZINCRBY:讓sorted set中的指定元素自增,步長(zhǎng)為指定的increment值
ZINCRBY
是 Redis 中用于對(duì)有序集合中指定成員的分?jǐn)?shù)進(jìn)行增加或減少的命令。
ZINCRBY key increment member
key
: 有序集合的鍵名。increment
: 要增加(正數(shù))或減少(負(fù)數(shù))的分?jǐn)?shù)。member
: 要增加或減少分?jǐn)?shù)的成員。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZINCRBY myzset 2 "one" "3" redis> ZRANGE myzset 0 -1 WITHSCORES 1) "two" 2) "2" 3) "one" 4) "3"
返回成員的新分?jǐn)?shù)。
行為說(shuō)明
- 如果給定的成員不存在于有序集合中,將會(huì)新增該成員并設(shè)置初始分?jǐn)?shù)。
- 如果給定的成員在有序集合中存在,將會(huì)更新該成員的分?jǐn)?shù)。
示例
有序集合 zset1
,其中包含成員 member1
和 member2
,它們的分?jǐn)?shù)分別是 10
和 20
:
ZADD zset1 10 member1 20 member2
將 member1
的分?jǐn)?shù)增加 5
:
ZINCRBY zset1 5 member1
執(zhí)行后:
返回值為 15
,表示 member1
的新分?jǐn)?shù)是 15
。
再將 member2
的分?jǐn)?shù)減少 3.5
:
ZINCRBY zset1 -3.5 member2
執(zhí)行后:
- 返回值為
16.5
,表示member2
的新分?jǐn)?shù)是16.5
。
注意事項(xiàng)
ZINCRBY
命令可以增加或減少有序集合中成員的分?jǐn)?shù),如果成員不存在,會(huì)新增該成員并設(shè)置初始分?jǐn)?shù)。
8 ZRANGE:按照score排序后,獲取指定排名范圍內(nèi)的元素
ZRANGE
是 Redis 中用于獲取有序集合中指定范圍內(nèi)成員的命令。
支持多種選項(xiàng)來(lái)定制輸出結(jié)果,包括按分?jǐn)?shù)、字典順序排序,反向排序,以及包含成員分?jǐn)?shù)等。
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
key
: 有序集合的鍵名。start
: 開(kāi)始位置(索引)。stop
: 結(jié)束位置(索引)。BYSCORE
: 按分?jǐn)?shù)排序。BYLEX
: 按字典順序排序。REV
: 反向排序。LIMIT offset count
: 返回結(jié)果的限制和偏移量。WITHSCORES
: 包含分?jǐn)?shù)在輸出結(jié)果中。
參數(shù)說(shuō)明
start
和stop
可以是負(fù)數(shù),表示從集合末尾開(kāi)始計(jì)算。例如,-1
表示最后一個(gè)元素,-2
表示倒數(shù)第二個(gè)元素,依此類推。BYSCORE
和BYLEX
不能同時(shí)使用。REV
可與BYSCORE
或BYLEX
一起使用,使得結(jié)果按指定順序的反向輸出。LIMIT offset count
用于分頁(yè),offset
表示偏移量,count
表示返回的最大元素?cái)?shù)量。WITHSCORES
將成員的分?jǐn)?shù)一起返回。
示例
有序集合 zset1
,其中包含以下成員和分?jǐn)?shù):
ZADD zset1 1 "one" 2 "two" 3 "three" 4 "four"
獲取索引從 0 到 2 的成員:
ZRANGE zset1 0 2
返回:
1) "one" 2) "two" 3) "three"
獲取索引從 0 到 2 的成員,并包含分?jǐn)?shù):
ZRANGE zset1 0 2 WITHSCORES
返回:
1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3"
按分?jǐn)?shù)范圍獲取成員,從分?jǐn)?shù) 1 到 3:
ZRANGE zset1 1 3 BYSCORE
返回:
1) "one" 2) "two" 3) "three"
按字典順序獲取成員,并反向排列:
ZRANGE zset1 - + BYLEX REV
返回:
1) "two" 2) "three" 3) "one" 4) "four"
使用 LIMIT
選項(xiàng)來(lái)進(jìn)行分頁(yè),獲取按分?jǐn)?shù)排序后的前兩個(gè)成員:
ZRANGE zset1 -inf +inf BYSCORE LIMIT 0 2
返回:
1) "one" 2) "two"
9 ZDIFF、ZINTER、ZUNION:求差集、交集、并集 ZDIFF
ZDIFF
用于計(jì)算多個(gè)有序集合之間的差集,并將結(jié)果存儲(chǔ)在新的有序集合中。
ZDIFF numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
numkeys
: 要進(jìn)行差集計(jì)算的有序集合數(shù)量。key
: 要進(jìn)行差集計(jì)算的有序集合鍵名。WEIGHTS weight [weight ...]
: 可選參數(shù),用于指定每個(gè)有序集合的權(quán)重,默認(rèn)為 1。AGGREGATE SUM|MIN|MAX
: 可選參數(shù),指定計(jì)算交集時(shí)如何聚合分?jǐn)?shù),默認(rèn)為SUM
。
示例:
ZDIFF 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
ZINTER
ZINTER
用于計(jì)算多個(gè)有序集合的交集,并將結(jié)果存儲(chǔ)在新的有序集合中。
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
參數(shù)說(shuō)明與 ZDIFF
類似,不同之處在于計(jì)算的是交集。
示例:
ZINTER 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
ZUNION
ZUNION
用于計(jì)算多個(gè)有序集合的并集,并將結(jié)果存儲(chǔ)在新的有序集合中。
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
參數(shù)說(shuō)明與 ZDIFF
和 ZINTER
類似,不同之處在于計(jì)算的是并集。
示例:
ZUNION 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
更多的SortedSet命令可以去官網(wǎng)https://redis.io/docs/latest/commands/?group=sorted-set查看哦~
到此這篇關(guān)于Redis SortedSet數(shù)據(jù)類型及其常用命令詳解的文章就介紹到這了,更多相關(guān)Redis SortedSet數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Redis未授權(quán)訪問(wèn)的問(wèn)題
這篇文章主要介紹了Redis未授權(quán)訪問(wèn)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07深入解析RedisJSON之如何在Redis中直接處理JSON數(shù)據(jù)
JSON已經(jīng)成為現(xiàn)代應(yīng)用程序之間數(shù)據(jù)傳輸?shù)耐ㄓ酶袷?然而,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在處理JSON數(shù)據(jù)時(shí)可能會(huì)遇到性能瓶頸,本文將詳細(xì)介紹RedisJSON的工作原理、關(guān)鍵操作、性能優(yōu)勢(shì)以及使用場(chǎng)景,感興趣的朋友一起看看吧2024-05-05springboot +redis 實(shí)現(xiàn)點(diǎn)贊、瀏覽、收藏、評(píng)論等數(shù)量的增減操作
這篇文章主要介紹了springboot +redis 實(shí)現(xiàn)點(diǎn)贊、瀏覽、收藏、評(píng)論等數(shù)量的增減操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Redisson如何解決redis分布式鎖過(guò)期時(shí)間到了業(yè)務(wù)沒(méi)執(zhí)行完問(wèn)題
這篇文章主要介紹了Redisson如何解決redis分布式鎖過(guò)期時(shí)間到了業(yè)務(wù)沒(méi)執(zhí)行完問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法
這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧,2016-12-12基于Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄功能
對(duì)于我們用戶來(lái)講,我們?cè)诘顷懸粋€(gè)APP的時(shí)候,有很多種登陸方式,比如"微信掃碼"、"手機(jī)號(hào)登陸"、"支付寶掃碼"、"賬號(hào)密碼登錄",現(xiàn)在大多都會(huì)要求微信掃碼登錄或者是手機(jī)號(hào)驗(yàn)證碼登錄,所以本文給大家介紹了基于Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,需要的朋友可以參考下2025-01-01