六. Set型Value操作命令
Reids儲存資料的Value可以是一個Set集合,且集合中的每一個元素均為String型別,Set與List非常相似,當不同之處是Set中的元素具有無序性與不可重複性,而List具有有序性與可重複性。
Redis中的Set集合與Java中的Set集合的實現相似,其底層都是value為null的hash表,也正因為此,才會引發無序性與不可重複性。
6.1 sadd
>sadd key member [member ... ]
將一個或多個member元素加入到集合key當中,已經存在集合的member元素被忽略。
說明:加入key不存在,在建立一個只包含member元素作為成員的集合,當key不是集合型別時,返回一個錯誤。
6.2 smembers
>smembers key
返回集合key中的所有成員。
說明:不存在的key被視為空集合。若key中包含大量元素,則該命令可能會阻塞Redis服務。所以生產環境中一般不適用該命令,而使用sscan命令替代。
6.3 scard
>scard key
返回set集合的長度。
說明:當key不存在時,返回0.
6.4 sismember
>sismember key member
判斷member元素是否是集合key的成員。
說明:如果member元素是集合的成員,則返回1。如果member元素不是集合的成員,或key不存在,則返回0。
6.5 smove
>smove source destination member
將member 元素從source 集合移動到destination集合。
說明:如果source集合不存在或者不包含指定的member元素,則smove命令不執行任何操作,僅返回0。否則,member 元素從source 集合中被移除,並新增到destination集合中去,返回1。當destination集合已經包含了member元素時,smove命令只是簡單地將source集合中的member元素刪除。當source 或者 destination 不是集合型別時,返回一個錯誤。
6.6 srem
>srem key member [member ...]
移除集合key中的一個或多個member 元素,不存在的member元素會被忽略,且返回成功移除的元素個數。
說明:當key不是集合型別時,返回一個錯誤。
6.7 srandmember
>srandmember key [count]
返回集合中count個隨機元素。count預設值為1。
說明:若count為正數,且小於集合長度,那麼返回一個包含count個元素的陣列,陣列中的元素各不相同。如果count大於等於集合長度,那麼返回整個集合,如果count為負數,那麼返回一個包含count絕對值個元素的陣列,但陣列中的元素可能會出現重複。
6.8 spop
>spop key [count]
移除並返回集合中的count個隨機元素。count必須為正數,且預設值為1。
說明:如果count大於等於集合長度,那麼移除並返回整個集合。
6.9 sdiff
SDIFF key [key ...]
返回一個集合的全部成員,該集合是所有給定集合之間的差集。
說明:不存在的 key 被視為空集。返回值:一個包含差整合員的列表。
redis> SMEMBERS peter's_movies 1) "bet man" 2) "start war" 3) "2012" redis> SMEMBERS joe's_movies 1) "hi, lady" 2) "Fast Five" 3) "2012" redis> SDIFF peter's_movies joe's_movies 1) "bet man" 2) "start war"
6.10 sdiffstore
SDIFFSTORE destination key [key ...]
這個命令的作用和 SDIFF 類似,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
說明:如果 destination 集合已經存在,則將其覆蓋。destination 可以是 key 本身。返回值:結果集中的元素數量。
redis> SMEMBERS joe's_movies 1) "hi, lady" 2) "Fast Five" 3) "2012" redis> SMEMBERS peter's_movies 1) "bet man" 2) "start war" 3) "2012" redis> SDIFFSTORE joe_diff_peter joe's_movies peter's_movies (integer) 2 redis> SMEMBERS joe_diff_peter 1) "hi, lady" 2) "Fast Five"
6.11 sinter
SINTER key [key ...]
返回一個集合的全部成員,該集合是所有給定集合的交集。
說明:不存在的 key 被視為空集。當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。返回值:交整合員的列表。
6.12 sinterstore
SINTERSTORE destination key [key ...]
這個命令類似於 SINTER 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
說明:如果 destination 集合已經存在,則將其覆蓋。destination 可以是 key 本身。返回值:結果集中的成員數量。
6.13 sunion
SUNION key [key ...]
返回一個集合的全部成員,該集合是所有給定集合的並集。
說明:不存在的 key 被視為空集。返回值:並整合員的列表。
6.14 sunionstore
SUNIONSTORE destination key [key ...]
這個命令類似於 SUNION 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
說明:如果 destination 已經存在,則將其覆蓋。destination 可以是 key 本身。返回值:結果集中的元素數量。
6.15 應用場景
(1)動態黑白名單
例如某伺服器中要設定訪問控制的黑名單,如果直接將黑名單寫入伺服器的配置檔案,那麼存在的問題是,無法動態修改黑名單。此時可以將黑名單直接寫入redis,只要有客戶端訪問伺服器,伺服器在獲取到客戶端IP後先從redis的黑名單中檢視是否存在該IP,如果存在,則拒絕訪問,否則予以放行。
(2)有限隨機數
有限隨機數是指返回的隨機數是基於某一集合範圍內的隨機數,例如抽獎、隨機選人。透過spop 或 srandmember可以實現從指定集合中隨機選出元素。
(3)使用者畫像
社交平臺、電商平臺等各種需要使用者註冊登入的平臺,會根據使用者提供的資料與使用者使用習慣,為每一個使用者進行畫像,即為每個使用者進行定義很多可以反應該使用者特徵的標籤,這些標籤就可以使用sadd新增到該使用者對應的集合中。這些標籤具有無序、不重複特徵。同時,平臺還可以使用sinter / sinterstore 根據使用者畫像的交集進行好友推薦、商品推薦、客戶推薦等。
七.有序Set型Value操作命令
Redis儲存資料的Value可以是一個有序Set,這個有序Set中的每個元素均為String型別。有序Set與Set的區別是,有序Set中的每一個元素都有一個分值score,redis會根據score的值對集合進行由小到大的排序。其與Set集合要求相同,元素不能重複,但元素的score可以重複,由於該型別的所有命令均是字母z開頭,所以該Set也稱ZSet。
7.1 zadd
>zadd key score member [[score member] [score member]...]
將一個或多個member 元素及其score值加入到有序集key中的適當位置。
說明:score值可以是整數或雙精度浮點數。如果key不存在,則建立一個空的有序並執行zadd操作。當key不存在但不是有序集型別時,返回一個錯誤。如果命令執行成功,則返回被成功新增的新成員的數量,不包括那些被更新的、已經存在的成員。若寫入的member值已經存在,但score值不同,則新的score值將覆蓋老score。
7.2 zrange 與 zrevrange
zrange key start stop [withscores] 或 zrevrange key start stop [withscores]
返回有序集key中,指定區間內的成員。zrange命令會按score值遞增排序,zrevrange命令會按score遞減排序。具有相同score值的成員按字典序/逆字典序排列。加帶引數withscores,就是將分值(score)一併帶出,即返回結果中youscore。
說明:下標引數從0開始,即0代表有序集第一個成員,以1表示有序集第二個成員,以此類推。也可以使用負數下標,-1表示最後一個成員,-2表示倒數第二個成員,以此類推。超出範圍的下標並不會引起錯誤,例如,當start的值比有序集的最大下標還大,或是start>stop時,zrange命令只是簡單地返回一個空列表。再比如stop引數的值比有序集的最大下標還要大,那麼redis將stop當作最大下標來處理。
若key中指定範圍內包含大量元素,則該命令可能會阻塞redis服務,所以生產環境中如果要查詢有序集合中的所有元素,一般不使用該命令,而使用zscan命令代替。
7.3 zrangebyscore 與 zrevrangebyscore
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 值一起返回。min 和 max 可以是 -inf 和 +inf ,這樣一來,你就可以在不知道有序集的最低和最高 score 值的情況下,使用 ZRANGEBYSCORE 這類命令。
預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以透過給引數前增加 ”(“ 符號來使用可選的開區間 (小於或大於)。返回值:指定區間內,帶有 score 值(可選)的有序整合員的列表。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回有序集 key 中, score 值介於 max 和 min 之間(預設包括等於 max 或 min )的所有的成員。有序整合員按 score 值遞減(從大到小)的次序排列。
說明:具有相同 score 值的成員按字典序的逆序(reverse lexicographical order )排列。除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。
7.4 zcard
>zcard key
返回集合的長度
說明:當key不存在時,返回0。
7.5 zcount
>zcount key min max
返回有序集key中,score值在min 和 max 之間(預設包括score值等於min或max)的成員的數量。
說明:返回值為score
值在 min
和 max
之間的成員的數量。
7.6 zscore
ZSCORE key member
返回有序集 key 中,成員 member 的 score 值。
說明:如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。執行成功,其返回值為 member 成員的 score 值,且以字串形式表示。# 注意返回值是字串。
7.7 zincrby
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 值,以字串形式表示。
7.8 zrank 與 zrevrank 【rank是排名的以此】
ZRANK key member
返回有序集 key 中成員 member 的排名。其中有序整合員按 score 值遞增(從小到大)順序排列。
說明:排名以 0 為底,也就是說, score 值最小的成員排名為 0 。使用 ZREVRANK 命令可以獲得成員按 score 值遞減(從大到小)排列的排名。返回值:如果 member 是有序集 key 的成員,返回 member 的排名。如果 member 不是有序集 key 的成員,返回 nil 。
ZREVRANK key member
返回有序集 key 中成員 member 的排名。其中有序整合員按 score 值遞減(從大到小)排序。
說明:排名以 0 為底,也就是說, score 值最大的成員排名為 0 。使用 ZRANK 命令可以獲得成員按 score 值遞增(從小到大)排列的排名。返回值:如果 member 是有序集 key 的成員,返回 member 的排名。如果 member 不是有序集 key 的成員,返回 nil 。
7.9 zrem
ZREM key member [member ...]
移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。
說明:當 key 存在但不是有序集型別時,返回一個錯誤。執行成功時,返回值為被成功移除的成員的數量,不包括被忽略的成員。
7.10 zremrangebyrank
zremrangebyrank key start stop
移除有序集key中,指定排名(rank)區間內的所有成員。
說明:排名區間分別以下標引數start 和 stop 指出,包含start 和 stop 以內。排名區間引數從0開始,即0表示排名第一的成員,1表示排名第二的成員,以此類推。也可以使用負數來表示,-1 表示最後一個成員,-2 表示排名倒數第二個成員,以此類推。命令執行成功,則返回被移除成員的數量。
7.11 zremrangebyscore
zremrangebyscore key min max [limit offset count]
移除有序集key中,所有score值介於min 和 max之間(包括等於min或max)的成員。
說明:命令執行成功,則返回被移除成員的數量。
7.12 zrangebylex
zrangebylex key min max [limit offset count]
該命令僅適用於集合中所有成員都具有相同分值的情況。當有序集合的所有成員都具有相同的分值時,有序集合的元素會根據成員的字典序(lexicographical ordering)來進行排序。即這個命令返回給定集合中元素介於min 和 max 之間的成員。如果有序集合裡面的成員帶有不同的分值,那麼命令的執行效果和zrange key 一樣。
說明:合法的min 和 max 引數必須包含左小括號”(“ 或或左中括號”[“,其中左小括號”(“表示開區間,而左中括號”[“表示閉區間,min或max也可使用特殊字元”+“ 和 ”-“,分別表示正無窮大與負無窮大。
7.13 zlexcount
>zlexcount key min max
該命令僅適用於集合中所有成員都具有相同分值的情況。該命令返回該集合中元素值本身(而非score值)介於min 和 max 範圍內的元素數量。
7.14 zremrangebylex
>zremrangebylex key min max
該命令僅適用於集合中所有成員都具有相同分值的情況。該命令會移除該集合中元素值本身介於min 和 max 範圍內的所有元素。
7.15 應用場景
有序set最為經典的應用場景就是排行榜,例如音樂、影片平臺中根據播放量進行排序的排行榜;電商平臺根據使用者評價或銷售量進行排序的排行榜等。將播放量作為score,將作品id作為member,將使用者評價積分或銷售量作為score,將商家id作為member。使用zincrby增加排序score,使用zrevrange獲取top前幾名,使用zrevrank查詢查詢當前排名,使用zscore查詢當前排序score等。
學習參閱宣告
1.【Redis影片從入門到高階】
https://www.bilibili.com/video/BV1U24y1y7jF?p=11&vd_source=0e347fbc6c2b049143afaa5a15abfc1c】
2. 【Redis 命令參考】
https://haiyong.site/doc/redis/redis-gh-pages/hash/hscan.html