> **Redis-常用類型操作命令2(Set/sorted set)**
[TOC]
## 說明 ##
**記錄以下Redis常用類型的操作命令。**
----------
##集合介紹##
Redis 集合(Set)
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
## Set ##
<h5>SADD(增加元素)</h5>
SADD key member [member …] 將一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素將被忽略。
假如 key 不存在,則創建一個只包含 member 元素作成員的集合。
當 key 不是集合類型時,返回一個錯誤。
返回值:被添加到集合中的新元素的數量,不包括被忽略的元素。
----------
127.0.0.1:6379> sadd people zhangsan
(integer) 1
127.0.0.1:6379> sadd people zhangsan
(integer) 0
127.0.0.1:6379> sadd people lisi
(integer) 1
127.0.0.1:6379> smembers people
1) "lisi"
2) "zhangsan"
<h5>SISMEMBER(判斷是否時集合元素)</h5>
SISMEMBER key member:判斷 member 元素是否集合 key 的成員。
返回值:如果 member 元素是集合的成員,返回 1 。 如果 member 元素不是集合的成員,或 key 不存在,返回 0 。
----------
127.0.0.1:6379> smembers people
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> sismember people lisi
(integer) 1
127.0.0.1:6379> sismember people zhaoliu
(integer) 0
<h5>SPOP(隨機刪除元素并返回)</h5>
SPOP:移除并返回集合中的一個隨機元素。
如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用 SRANDMEMBER key [count] 命令。
返回值:被移除的隨機元素。 當 key 不存在或 key 是空集時,返回 nil
----------
127.0.0.1:6379> spop people
"lisi"
127.0.0.1:6379> smembers people
1) "zhangsan"
<h5>SRANDMEMBER(隨機返回元素)</h5>
SRANDMEMBER key [count]:如果命令執行時,只提供了 key 參數,那么返回集合中的一個隨機元素。
如果 count 為正數,且小于集合基數,那么命令返回一個包含 count 個元素的數組,數組中的元素各不相同。如果 count 大于等于集合基數,那么返回整個集合。
如果 count 為負數,那么命令返回一個數組,數組中的元素可能會重復出現多次,而數組的長度為 count 的絕對值。
該操作和 SPOP key 相似,但 SPOP key 將隨機元素從集合中移除并返回,而 SRANDMEMBER 則僅僅返回隨機元素,而不對集合進行任何改動。
----------
127.0.0.1:6379> srandmember people
"lisi"
127.0.0.1:6379> srandmember people
"zhangsan"
127.0.0.1:6379> srandmember people
"zhangsan"
<h5>SREM(刪除元素)</h5>
SREM key member [member …]:移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
當 key 不是集合類型,返回一個錯誤。
返回值
被成功移除的元素的數量,不包括被忽略的元素。
----------
127.0.0.1:6379> smembers people
1) "zhaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
5) "gouqi"
127.0.0.1:6379> srem people zhangsan
(integer) 1
127.0.0.1:6379> smembers people
1) "wangwu"
2) "lisi"
3) "gouqi"
4) "zhaoliu"
<h5>SMOVE(移動元素到另外集合)</h5>
SMOVE source destination member:將 member 元素從 source 集合移動到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,并添加到 destination 集合中去。
當 destination 集合已經包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。
當 source 或 destination 不是集合類型時,返回一個錯誤。
返回值
如果 member 元素被成功移除,返回 1 。 如果 member 元素不是 source 集合的成員,并且沒有任何操作對 destination 集合執行,那么返回 0 。
----------
127.0.0.1:6379> smembers people
1) "lisi"
2) "wangwu"
3) "gouqi"
4) "zhaoliu"
127.0.0.1:6379> smove people teachers lisi
(integer) 1
127.0.0.1:6379> SMEMBERS teachers
1) "lisi"
127.0.0.1:6379>
<h5>SCARD(返回集合元素數量)</h5>
SCARD key:返回集合 key 的基數(集合中元素的數量)。
----------
127.0.0.1:6379> scard teachers
(integer) 1
127.0.0.1:6379> scard people
(integer) 3
<h5>SMEMBERS(查看集合所有元素)</h5>
SMEMBERS key:不存在的 key 被視為空集合。
返回值:集合中的所有成員。
----------
127.0.0.1:6379> SMEMBERS teachers
1) "lisi"
127.0.0.1:6379> SMEMBERS people
1) "wangwu"
2) "gouqi"
3) "zhaoliu"
<h5>SINTER(返回集合交集)</h5>
SINTER key [key …]:返回一個集合的全部成員,該集合是所有給定集合的交集。
不存在的 key 被視為空集。
當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。
----------
127.0.0.1:6379> SMEMBERS people
1) "wangwu"
2) "gouqi"
3) "zhaoliu"
127.0.0.1:6379> sinter people teachers
(empty list or set)
127.0.0.1:6379> sadd teachers wangwu
(integer) 1
127.0.0.1:6379> sinter people teachers
1) "wangwu"
<h5>SINTERSTORE(將交集保存到集合)</h5>
SINTERSTORE destination key [key …]:這個命令類似于 SINTER key [key …] 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。
----------
127.0.0.1:6379> SMEMBERS people
1) "wangwu"
2) "gouqi"
3) "zhaoliu"
127.0.0.1:6379> sinter people teachers
(empty list or set)
127.0.0.1:6379> sadd teachers wangwu
(integer) 1
127.0.0.1:6379> sinter people teachers
1) "wangwu"
127.0.0.1:6379> sinterstore newset people teachers
(integer) 1
127.0.0.1:6379> smembers newset
1) "wangwu"
<h5>SUNION(返回集合并集) </h5>
SUNION key [key …]:返回一個集合的全部成員,該集合是所有給定集合的并集。
不存在的 key 被視為空集。
返回值并集成員的列表。
----------
127.0.0.1:6379> sunion people teachers
1) "gouqi"
2) "lisi"
3) "zhaoliu"
4) "wangwu"
<h5>SUNIONSTORE(將并集保存到集合)</h5>
SUNIONSTORE destination key [key …]:這個命令類似于 SUNION key [key …] 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 已經存在,則將其覆蓋。
destination 可以是 key 本身。
----------
127.0.0.1:6379> sunionstore peoples people teachers
(integer) 2
127.0.0.1:6379> SMEMBERS peoples
1) "lisi"
2) "wangwu"
<h5>SDIFF(返回差集)</h5>
SDIFF key [key …]:返回一個集合的全部成員,該集合是所有給定集合之間的差集。
不存在的 key 被視為空集。
返回值:一個包含差集成員的列表。
----------
127.0.0.1:6379> sdiff people teachers
(empty list or set)
127.0.0.1:6379> sadd people zhaoliu
(integer) 1
127.0.0.1:6379> sdiff people teachers
1) "zhaoliu"
<h5>SDIFFSTORE(保存差集到集合)</h5>
SDIFFSTORE destination key [key …]:這個命令的作用和 SDIFF key [key …] 類似,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。
返回值:結果集中的元素數量。
----------
127.0.0.1:6379> sdiffstore setdiff people teachers
(integer) 1
127.0.0.1:6379> SMEMBERS setdiff
1) "zhaoliu"
##有序集合##
Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
##sorted set##
<h5>ZADD</h5>
ZADD key score member [[score member] [score member] …]:將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
如果某個 member 已經是有序集的成員,那么更新這個 member 的 score 值,并通過重新插入這個 member 元素,來保證該 member 在正確的位置上。
score 值可以是整數值或雙精度浮點數。
如果 key 不存在,則創建一個空的有序集并執行 ZADD 操作。
當 key 存在但不是有序集類型時,返回一個錯誤。
對有序集的更多介紹請參見 sorted set 。
在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素。
返回值:被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。
----------
127.0.0.1:6379> ZRANGE people 0 -1
1) "zhangsan"
2) "wangwu"
3) "zhaoliu"
127.0.0.1:6379> ZRANGE people 0 -1 withscores
1) "zhangsan"
2) "1"
3) "wangwu"
4) "3"
5) "zhaoliu"
6) "6"
<h5>ZSCORE(返回score的值)</h5>
ZSCORE key member:返回有序集 key 中,成員 member 的 score 值。
如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。
返回值:member 成員的 score 值,以字符串形式表示。
----------
127.0.0.1:6379> ZRANGE people 0 -1 withscores
1) "zhangsan"
2) "1"
3) "wangwu"
4) "3"
5) "zhaoliu"
6) "6"
127.0.0.1:6379> ZSCORE people wangwu
"3"
<h5>ZINCRBY(增加score的值)</h5>
ZINCRBY key increment member:為有序集 key 的成員 member 的 score 值加上增量 increment 。
可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同于 ZADD key increment member 。
當 key 不是有序集類型時,返回一個錯誤。
score 值可以是整數值或雙精度浮點數。
返回值:member 成員的新 score 值,以字符串形式表示。
----------
127.0.0.1:6379> ZRANGE people 0 -1 withscores
1) "zhangsan"
2) "1"
3) "wangwu"
4) "3"
5) "zhaoliu"
6) "6"
127.0.0.1:6379> ZINCRBY people 1 zhangsan
"2"
<h5>ZCARD(返回集合數量)</h5>
ZCARD key返回有序集 key 的基數。
返回值:當 key 存在且是有序集類型時,返回有序集的基數。 當 key 不存在時,返回 0 。
----------
127.0.0.1:6379> ZRANGE people 0 -1
1) "zhangsan"
2) "wangwu"
3) "zhaoliu"
127.0.0.1:6379> zcard people
(integer) 3
<h5>ZCOUNT(返回指定元素范圍內的元素數量)</h5>
ZCOUNT key min max:返回有序集 key 中, score 值在 min 和 max 之間(默認包括 score 值等于 min 或 max )的成員的數量。
關于參數 min 和 max 的詳細使用方法,請參考 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。
返回值:score 值在 min 和 max 之間的成員的數量。
----------
127.0.0.1:6379> ZRANGE people 0 -1 withscores
1) "zhangsan"
2) "2"
3) "wangwu"
4) "3"
5) "zhaoliu"
6) "6"
127.0.0.1:6379> zcount people 0 10
(integer) 3
127.0.0.1:6379> zcount people 2 10
(integer) 3
127.0.0.1:6379> zcount people 3 10
(integer) 2
127.0.0.1:6379
<h5>ZRANGE(返回指定下標內的元素-遞增)</h5>
ZRANGE key start stop [WITHSCORES]返回有序集 key 中,指定區間內的成員。
其中成員的位置按 score 值遞增(從小到大)來排序。
具有相同 score 值的成員按字典序(lexicographical order )來排列。
如果你需要成員按 score 值遞減(從大到小)來排列,請使用 ZREVRANGE key start stop [WITHSCORES] 命令。
下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。
超出范圍的下標并不會引起錯誤。 比如說,當 start 的值比有序集的最大下標還要大,或是 start > stop 時, ZRANGE 命令只是簡單地返回一個空列表。 另一方面,假如 stop 參數的值比有序集的最大下標還要大,那么 Redis 將 stop 當作最大下標來處理。
可以通過使用 WITHSCORES 選項,來讓成員和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。 客戶端庫可能會返回一些更復雜的數據類型,比如數組、元組等。
返回值:指定區間內,帶有 score 值(可選)的有序集成員的列表。
----------
127.0.0.1:6379> ZRANGE people 0 1 withscores
1) "zhangsan"
2) "2"
3) "wangwu"
4) "3"
127.0.0.1:6379> ZRANGE people 0 -1 withscores
1) "zhangsan"
2) "2"
3) "wangwu"
4) "3"
5) "zhaoliu"
6) "6"
127.0.0.1:6379> ZRANGE people 0 -1
1) "zhangsan"
2) "wangwu"
3) "zhaoliu"
<h5>ZREVRANGE</h5>
> ZRANGE遞增排序,ZREVRANGE遞減排序
<h5>ZRANGEBYSCORE(按SCORE范圍返回元素-遞增)</h5>
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。
具有相同 score 值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。
可選的 LIMIT 參數指定返回結果的數量及區間(就像SQL中的 SELECT LIMIT offset, count ),注意當 offset 很大時,定位 offset 的操作可能需要遍歷整個有序集,此過程最壞復雜度為 O(N) 時間。
可選的 WITHSCORES 參數決定結果集是單單返回有序集的成員,還是將有序集成員及其 score 值一起返回。 該選項自 Redis 2.0 版本起可用
----------
**區間及無限**
min 和 max 可以是 -inf 和 +inf ,這樣一來,你就可以在不知道有序集的最低和最高 score 值的情況下,使用 ZRANGEBYSCORE 這類命令。
默認情況下,區間的取值使用閉區間 (小于等于或大于等于),你也可以通過給參數前增加 ( 符號來使用可選的開區間 (小于或大于)。
舉個例子:
ZRANGEBYSCORE zset (1 5
返回所有符合條件 1 < score <= 5 的成員,而
ZRANGEBYSCORE zset (5 (10
則返回所有符合條件 5 < score < 10 的成員。
返回值:指定區間內,帶有 score 值(可選)的有序集成員的列表。
----------
127.0.0.1:6379> zadd salary 1000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 3000 lisan
(integer) 1
127.0.0.1:6379> zadd salary 5000 wangsan
(integer) 1
127.0.0.1:6379> zadd salary 4500 gousan
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 withscores
1) "zhangsan"
2) "1000"
3) "lisan"
4) "3000"
5) "gousan"
6) "4500"
7) "wangsan"
8) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf (5000 withscores
1) "zhangsan"
2) "1000"
3) "lisan"
4) "3000"
5) "gousan"
6) "4500"
<h5>ZRANGEBYSCOR</h5>
> ZREVRANGEBYSCORE 值遞減(從大到小)次序排列。
<h5>ZRANK(返回指定元素排名)</h5>
ZRANK key member:返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞增(從小到大)順序排列。
排名以 0 為底,也就是說, score 值最小的成員排名為 0 。
使用 ZREVRANK key member 命令可以獲得成員按 score 值遞減(從大到小)排列的排名。
----------
127.0.0.1:6379> ZRANK salary lisan
(integer) 1
<h5>ZREVRANK</h5>
> 顯示遞減排名
<h5>ZREM(刪除指定名稱的元素)</h5>
ZREM key member [member …]移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。
當 key 存在但不是有序集類型時,返回一個錯誤。
返回值:被成功移除的成員的數量,不包括被忽略的成員。
----------
127.0.0.1:6379> zrem salary zhangsan
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "lisan"
2) "gousan"
3) "wangsan"
<h5>ZREMRANGEBYRANK(刪除排名范圍內的元素)</h5>
ZREMRANGEBYRANK key start stop:移除有序集 key 中,指定排名(rank)區間內的所有成員。
區間分別以下標參數 start 和 stop 指出,包含 start 和 stop 在內。
下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。
返回值:被移除成員的數量。
----------
127.0.0.1:6379> ZRANGE salary 0 -1
1) "lisan"
2) "gousan"
3) "wangsan"
127.0.0.1:6379> ZREMRANGEBYRANK salary 0 1
(integer) 2
127.0.0.1:6379> ZRANGE salary 0 -1
1) "wangsan"
<h5>ZREMRANGEBYSCORE(刪除SCORE范圍內的元素)</h5>
ZREMRANGEBYSCORE key min max:移除有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。
自版本2.1.6開始, score 值等于 min 或 max 的成員也可以不包括在內,詳情請參見 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。
----------
redis> ZRANGE salary 0 -1 WITHSCORES # 顯示有序集內所有成員及其 score 值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"
redis> ZREMRANGEBYSCORE salary 1500 3500 # 移除所有薪水在 1500 到 3500 內的員工
(integer) 2
redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成員
1) "jack"
2) "5000"
<h5>ZREMRANGEBYSCORE(刪除SCORE范圍內的元素)</h5>
<h5>ZUNIONSTORE(并集之后保存到集合)</h5>
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]:計算給定的一個或多個有序集的并集,其中給定 key 的數量必須以 numkeys 參數指定,并將該并集(結果集)儲存到 destination 。
默認情況下,結果集中某個成員的 score 值是所有給定集下該成員 score 值之 和 。
----------
WEIGHTS
使用 WEIGHTS 選項,你可以為 每個 給定有序集 分別 指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的 score 值在傳遞給聚合函數(aggregation function)之前都要先乘以該有序集的因子。
如果沒有指定 WEIGHTS 選項,乘法因子默認設置為 1 。
AGGREGATE
使用 AGGREGATE 選項,你可以指定并集的結果集的聚合方式。
默認使用的參數 SUM ,可以將所有集合中某個成員的 score 值之 和 作為結果集中該成員的 score 值;使用參數 MIN ,可以將所有集合中某個成員的 最小 score 值作為結果集中該成員的 score 值;而參數 MAX 則是將所有集合中某個成員的 最大 score 值作為結果集中該成員的 score 值。
返回值:保存到 destination 的結果集的基數。
----------
redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"
redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司決定加薪。。。除了程序員。。。
(integer) 6
redis> ZRANGE salary 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"
## 結尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
腹有詩書氣自華,最是書香能致遠。
</p>