Redis命令介紹之有序集合的操作命令(第一部分)
在前面的章節中,我們介紹了Redis中字串、雜湊(Hash)、列表(List)以及集合(Set)四種資料型別,本文將繼續介紹Redis中的有序集合。在Redis中,有序集合(Sorted Set)是一種與集合類似的結構。與集合不同的是,有序集合中每個元素都會關聯一個浮點數值,稱之為score
。在有序集合中,始終通過元素的score
值進行排序。
由於有序集合的操作命令較多,將分為兩篇文章,其中本文將會先介紹有序集合的ZADD
、ZCARD
、ZREM
等命令。
ZADD
ZADD
命令用於將指定元素及其score
值新增至有序集合中,並返回新增的元素個數(除使用INCR
引數的情況外),在Redis 2.4及以上版本中可一次新增一個或多個元素。當新增的元素已存在時,將會更新其score
值,並根據該值重新插入到對應的位置保持正確的順序。
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
有序集合中元素的score
值為一個64位浮點數值,並使用IEEE 754浮點數標準所表示。它可被表示為-(2^54) ~ (2^54)之間的整數,且可使用+inf
及-inf
分別表示為正負無窮大值。當有序集合中有多個元素的score
值相同時,將安裝字典序(lexicographically)進行排序,字典序即對應的單詞在字典中的先後順序。
引數
Redis 3.0.2及以上版本支援以下引數:
NX
:不更新已經存在的元素,只增加新元素。XX
:只更新已經存在的元素,不增加新元素。CH
:返回值由新增的元素個數變為修改的元素個數,修改的元素包括新增的元素和已存在元素中score
值有更新的元素。INCR
:使用該引數時執行的操作類似於ZINCRBY
操作,對指定元素的score
值執行遞增操作,並返回更新後的score
值。當操作執行失敗時(如使用了NX
或XX
引數的情況下),將返回nil
。
其中,NX
與XX
引數不能同時使用。另外,使用INCR
引數時與其它情況較為不同,只允許設定一個元素,並返回更新後的score
值。
示例
redis> ZADD numbers 1 "one" 2 "two"
(integer) 2
redis> ZRANGE numbers 0 -1
1) "one"
2) "two"
# 新增的元素中包含已存在的元素,將會更新該元素
redis> ZADD numbers 4 "one" 3 "three"
(integer) 1
redis> ZRANGE numbers 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"
5) "one"
6) "4"
使用NX
引數:
redis> ZADD numbers 1 "one" 2 "two"
(integer) 2
redis> ZADD numbers 0 -1
1) "one"
2) "two"
redis> ZADD numbers NX 4 "one" 3 "three"
(integer) 1
redis> ZRANGE numbers 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
使用XX
引數:
redis> ZADD numbers 1 "one" 2 "two"
(integer) 2
redis> ZADD numbers 0 -1
1) "one"
2) "two"
redis> ZADD numbers NX 4 "one" 3 "three"
(integer) 1
redis> ZRANGE numbers 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "4"
使用CH
引數:
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZADD numbers CH 1 "one"
(integer) 0
redis> ZADD numbers CH 2 "one"
(integer) 1
使用INCR
引數:
redis> ZADD numbers INCR 1 "one"
"1"
redis> ZADD numbers NX INCR 1 "one"
(nil)
redis> ZADD numbers INCR 1 "one"
"2"
ZRANGE
ZRANGE
命令用於獲取有序集合中有start
及stop
引數所指定範圍內的元素,並以其score
值按從小到大的順序返回。當存在多個元素score
值相同時,將按字典序排列。
ZRANGE key start stop [WITHSCORES]
start
及stop
引數為以0為開始的索引數值,即0
代表第一個元素,1
代表第二個元素。當值為負數時,表示相對於有序集合末尾的的偏移值,即-1
代表有序集合中最後一個元素,-2
代表倒數第二個元素。start
與stop
所對應位置的元素都將被包含在返回的資料中,例如使用ZRANGE key 0 1
將返回第一個和第二個元素。
當獲取的返回超出有序集合的大小時不會產生錯誤。當start
大於有序集合的大小或start
的值大於stop
的值時,將會返回一個空列表。當stop
的值大於有序集合的大小時,將只會獲取到最後一個元素為止。
當使用引數WITHSCORES
時,返回的結果將包括各元素的score
值,並以value1, score1, ..., valueN, scoreN
的順序返回。
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZRANGE numbers 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE numbers -2 -1
1) "two"
2) "three"
redis> ZRANGE numbers 2 5
1) "three"
使用WITHSCORES
引數:
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZRANGE numbers 0 -1
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "6"
ZREVRANGE
ZREVRANGE
命令與ZRANGE
命令相似,也用於列出有序集合中指定位置的元素,但其排列順序為按score
值從高到低。當多個元素score
值相同時,將按字典序逆向排序。
ZREVRANGE key start stop [WITHSCORES]
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZRREVANGE numbers 0 -1
1) "three"
2) "two"
3) "one"
redis> ZRREVANGE numbers -2 -1
1) "two"
2) "one"
redis> ZRREVANGE numbers 2 3
1) "one"
ZREM
ZREM
命令用於移除有序集合中的指定元素,並實際時間移除的元素個數。其中,不存在的元素將被忽略。當key
對應的鍵存在但型別不為有序集合時,將返回錯誤。
ZREM key member [member ...]
在Redis 2.4及以上的版本中,ZREM
支援一次移除多個元素。
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZREM numbers "one" "four" "five"
(integer) 1
redis> ZRANGE numbers 0 -1
1) "two"
2) "three"
ZCARD
ZCARD
命令用於獲取有序集合的基數(cardinality,即集合中元素的個數),若集合不存在則返回0
。
ZCARD key
示例
# 集合numbers不存在
redis> ZCARD numbers
(integer) 0
redis> ZADD numbers 1 "one"
(integer) 1
redis> ZADD numbers 2 "two"
(integer) 1
redis> ZCARD numbers
(integer) 2
ZSCAN
ZSCAN
命令與前文中介紹過的SCAN
命令類似,它用於增量式的迭代獲取集合中的所有元素。同樣,ZSCAN
命令是一個基於遊標cursor
的迭代器,每次執行後將會返回一個新的遊標,以作為下一輪迭代的遊標引數。關於更多ZSCAN
命令的用法,可參考SCAN
命令。
ZSCAN key cursor [MATCH pattern] [COUNT count]
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> SCAN numbers 0
1) "0"
2) 1) "two"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
ZSCORE
ZSCORE
命令用於獲取有序集合中指定元素的score
值,並以字串的形式返回。若集合中不存在該元素或集合不存在,則返回nil
。
ZSCORE key member
示例
# 集合numbers不存在
redis> ZSCORE numbers "one"
(nil)
redis> ZADD numbers 1 "one"
(integer) 1
redis> ZSCORE numbers "one"
"1"
# 不存在的元素
redis> ZSCORE numbers "two"
(nil)
ZINCRBY
ZINCRBY
命令用於將有序集合中元素score
的值增加increment
引數所指定的值,並返回新值。若元素不存在,則認為其原值為0.0
。
ZINCRBY key increment member
increment
引數接受整型或浮點型的值,若該值為負數則將為該元素的score
值減去increment
的絕對值。
示例
redis> ZADD numbers 1 "one"
(integer) 1
redis> ZINCRBY numbers 2 "one"
(integer) 3
redis> ZSCORE numbers "one"
"3"
集合中不存在指定的元素的情況:
redis> ZSCORE numbers "one"
(nil)
redis> ZINCRBY numbers 1 "one"
(integer) 1
redis> ZSCORE numbers "one"
"1"
ZRANGEBYSCORE
ZRANGEBYSCORE
命令用於獲取有序集合中score
值在min
與max
範圍之間的元素,並以score
值從低到高的順序返回。當有多個元素的score
值相同時將以字典序進行排序。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
min
與max
引數分別表示獲取的元素中score
的最小值與最大值。其中,min
和max
引數除了可以使用數值表示外,還可以有以下幾種情況:
- 分別使用
-inf
以及+inf
表示正負無窮; - 使用
(
表示不包括引數所指定的值,例如:ZRANGEBYSCORE key (0 5
表示0 < score <= 5
ZRANGEBYSCORE key 0 (5
表示0 <= score < 5
ZRANGEBYSCORE key (0 (5
表示0 < score < 5
當使用引數LIMIT
時,表示獲取從offset
開始的數量為count
的元素。LIMIT
引數的使用類似與SQL中的SELECT LIMIT offset, limit
語句,例如ZRANGEBYSCORE key 0 5 LIMIT 1 2
表示獲取有序集合中score
值在0
到5
範圍內以從低到高的順序排序後第2個元素起的兩個元素。當count
的值為負數時,將返回剩下的所有元素。
與ZRANGE
相同,使用WITHSCORES
引數使返回的結果包含元素對應的score
值。
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"
(integer) 5
redis> ZRANGEBYSCORE numbers -inf +inf
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
redis> ZRANGEBYSCORE numbers 2 4
1) "two"
2) "three"
3) "four"
redis> ZRANGEBYSCORE numbers (2 4
1) "three"
2) "four"
redis> ZRANGEBYSCORE numbers 2 (4
1) "two"
2) "three"
redis> ZRANGEBYSCORE numbers (2 (4
1) "three"
使用LIMIT
引數:
redis> ZADD numbers 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"
(integer) 5
redis> ZRANGEBYSCORE numbers -inf +inf LIMIT 0 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE numbers -inf +inf LIMIT 2 2
1) "three"
2) "four"
ZREVRANGEBYSCORE
ZREVRANGEBYSCORE
命令與ZRANGEBYSCORE
命令相類似,二者區別為ZREVRANGEBYSCORE
命令以score
值從高到低的順序返回。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 4
redis> ZREVRANGESCORE numbers +inf -inf
1) "three"
2) "two"
3) "one"
ZCOUNT
ZCOUNT
命令用於獲取score
值在指定的範圍內的元素個數。
ZCOUNT key min max
與ZRANGEBYSCORE
相同,ZCOUNT
的引數min
和max
可使用-inf
和+inf
表示正/負無窮,並使用(
表示不包括引數所指定的值。
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
# -inf <= score <= +inf
redis> ZCOUNT numbers -inf +inf
(integer) 3
# 1 <= score <= 3
redis> ZCOUNT numbers 1 3
(integer) 3
# 1 < score <= 3
redis> ZCOUNT numbers (1 3
(integer) 2
# 1 < score < 3
redis> ZCOUNT numbers (1 (3
(integer) 1
ZPOPMAX
ZPOPMAX
命令用於移除並返回有序集合中分值(即score
值)最高的引數count
所指定個數的元素。若count
引數未指定,其值預設為1
。當count
的值大於集合中元素的數量,將移除並返回全部的元素而非返回錯誤。
ZPOPMAX key [count]
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZPOPMAX numbers
1) "three"
2) "3"
redis> ZRANGE numbers 0 -1
1) "one"
2) "two"
移除多個元素:
redis> ZADD numbers 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"
(integer) 5
redis> ZPOPMAX numbers 3
1) "five"
2) "5"
3) "four"
4) "4"
5) "three"
6) "3"
count
大於集合中元素的個數的情況:
redis> ZADD numbers 1 "one" 2 "two"
(integer) 2
redis> ZCARD numbers
(integer) 2
redis> ZPOPMAX numbers 3
1) "two"
2) "2"
3) "one"
4) "1"
redis> ZPOPMAX numbers
(empty list or set)
ZPOPMIN
ZPOPMIN
命令與ZPOPMAX
命令相似,二者區別為ZPOPMIN
用於移除有序集合中分值(即score
的值)最小的元素。
ZPOPMIN key [count]
示例
redis> ZADD numbers 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZPOPMIN numbers
1) "one"
2) "1"
redis> ZRANGE numbers 0 -1
1) "two"
2) "three"
結束語
在本文中,我們介紹了有序集合的ZADD
、ZREM
、ZCARD
等命令,在有序集合的第二部分中,我們將繼續介紹其ZRANK
、ZLEXCOUNT
、BZPOPMAX
、ZINTERSTORE
等命令。
參考資料
歡迎大家關注我的公眾號“風紙”,或是掃下面的二維碼關注?
相關文章
- Redis有序集合命令Redis
- Redis 有序集合(zset)命令詳解Redis
- Redis有序集合操作Redis
- Redis有序集合命令ZREVRANGEBYSCORE詳解與應用RedisVR
- go操作redis的有序集合(zset)GoRedis
- php操作redis,有序集合zsetPHPRedis
- redis原始碼分析(七)、redis命令學習總結—Redis 有序集合(sorted set)Redis原始碼
- 【Redis】Redis的操作命令(一)——Redis Key命令Redis
- 【Redis】常用命令介紹Redis
- redis有序集合Redis
- Redis 有序集合Redis
- Redis介紹及常用命令Redis
- Python–Redis實戰:第三章:Redis命令:第五節:有序集合PythonRedis
- Python&Redis 無序集合set、有序集合zset操作PythonRedis
- Redis有序集合物件Redis物件
- Redis有序集合原理Redis
- Docker 映象及容器操作命令介紹Docker
- SQL命令及phpMyAdmin操作介紹SQLPHP
- Redis的有序集合(sorted set)Redis
- MySQL 命令列操作集合MySql命令列
- Redis有序集合詳解Redis
- Redis物件——有序集合(ZSet)Redis物件
- Redis有序集合學習Redis
- Redis 有序集合(sorted set)Redis
- Redis常用操作命令Redis
- Redis-Redis實戰(有序集合)Redis
- 《Redis實戰》筆記-Redis的有序集合Redis筆記
- SRVCTL命令介紹
- docker 命令介紹Docker
- tar命令介紹
- redis學習之有序集合Redis
- Redis雜湊與有序集合Redis
- Geth的命令列介紹命令列
- Redis Sort 命令簡介Redis
- redis命令之-listRedis
- Shell echo命令介紹
- HBase shell 命令介紹
- installer 命令介紹