Redis資料型別之SET型別
set型別-特點
set 是集合,和我們數學中的集合概念相似,對集合的操作有新增刪除元素,有對多個集合求交併差等操作,操作中 key 理解為集合的名字。
Redis 的 set 是 string 型別的無序集合。set 元素最大可以包含(2 的 32 次方)個元素。
set 的是通過 hash table 實現的,所以新增、刪除和查詢的複雜度都是 O(1)。hash table 會隨著新增或者刪除自動的調整大小。需要注意的是調整 hash table 大小時候需要同步(獲取寫鎖)會阻塞其他讀寫操作,可能不久後就會改用跳錶(skip list)來實現,跳錶已經在 sortedset 中使用了。關於 set 集合型別除了基本的新增刪除操作,其他有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現 sns中的好友推薦和 blog 的 tag 功能。
set型別-應用場景
set對外提供的功能與list類似,當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的介面,這個也是list所不能提供的,可以用Redis set結構實現SNS中的好友推薦和 blog 的 tag 功能。
set型別-常見命令
SADD
SADD key member [member …]
將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
假如 key 不存在,則建立一個只包含 member 元素作成員的集合。
當 key 不是集合型別時,返回一個錯誤。
時間複雜度: O(N),N 是被新增的元素的數量。
返回值: 被新增到集合中的新元素的數量,不包括被忽略的元素。# 新增單個元素 127.0.0.1:6379[15]> SADD bbs "discuz.net" (integer) 1 # 新增重複元素 127.0.0.1:6379[15]> SADD bbs "discuz.net" (integer) 0 # 新增多個元素 127.0.0.1:6379[15]> SADD bbs "tianya.cn" "groups.google.com" (integer) 2 127.0.0.1:6379[15]> SMEMBERS bbs 1) "tianya.cn" 2) "groups.google.com" 3) "discuz.net"
SREM
SREM key member [member …]
移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
當 key 不是集合型別,返回一個錯誤。
時間複雜度: O(N),N 為給定 member 元素的數量。
返回值: 被成功移除的元素的數量,不包括被忽略的元素。127.0.0.1:6379[15]> SADD languages c lisp python ruby (integer) 4 127.0.0.1:6379[15]> SMEMBERS languages 1) "python" 2) "lisp" 3) "c" 4) "ruby" # 移除單個元素 127.0.0.1:6379[15]> SREM languages ruby (integer) 1 # 移除不存在的元素 127.0.0.1:6379[15]> SREM languages non-exists-language (integer) 0 # 移除多個元素 127.0.0.1:6379[15]> SREM languages lisp python c (integer) 3 127.0.0.1:6379[15]> SMEMBERS languages (empty list or set)
SMEMBERS
SMEMBERS key
返回集合 key 中的所有成員。
不存在的 key 被視為空集合。
時間複雜度: O(N),N 為集合的基數。
返回值: 集合中的所有成員。127.0.0.1:6379[15]> EXISTS not_exists_key (integer) 0 127.0.0.1:6379[15]> SMEMBERS not_exists_key (empty list or set) 127.0.0.1:6379[15]> SADD language Ruby Python Clojure (integer) 3 127.0.0.1:6379[15]> SMEMBERS language 1) "Ruby" 2) "Clojure" 3) "Python"
SISMEMBER
SISMEMBER key member
判斷 member 元素是否集合 key 的成員。
時間複雜度: O(1)
返回值:
如果 member 元素是集合的成員,返回 1 。
如果 member 元素不是集合的成員,或 key 不存在,返回 0 。127.0.0.1:6379[15]> SADD "joe's_movies" "hi,lady" "fast five" "2012" (integer) 3 127.0.0.1:6379[15]> SMEMBERS "joe's_movies" 1) "fast five" 2) "hi,lady" 3) "2012" 127.0.0.1:6379[15]> SISMEMBER "joe's_movies" 2012 (integer) 1
SCARD
SCARD key
返回集合 key 的基數 (集合中元素的數量)。
時間複雜度: O(1)
返回值:
集合的基數。
當 key 不存在時,返回 0 。127.0.0.1:6379[15]> SADD tool pc printer phone (integer) 3 127.0.0.1:6379[15]> SCARD tool (integer) 3 127.0.0.1:6379[15]> DEL tool (integer) 1 127.0.0.1:6379[15]> SCARD tool (integer) 0
SPOP
SPOP key
移除並返回集合中的一個隨機元素。
如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用SRANDMEMBER 命令。
時間複雜度: O(1)
返回值:
被移除的隨機元素。
當 key 不存在或 key 是空集時,返回 nil 。127.0.0.1:6379[15]> SADD db MySql MongoDB Redis (integer) 3 127.0.0.1:6379[15]> SPOP db "Redis" 127.0.0.1:6379[15]> SMEMBERS db 1) "MySql" 2) "MongoDB" 127.0.0.1:6379[15]> SPOP db "MySql" 127.0.0.1:6379[15]> SMEMBERS db 1) "MongoDB"
SRANDMEMBER
SRANDMEMBER key [count]
如果命令執行時,只提供了 key 引數,那麼返回集合中的一個隨機元素。
SRANDMEMBER 命令接受可選的 count 引數:
如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的陣列,陣列中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。
如果 count 為負數,那麼命令返回一個數組,陣列中的元素可能會重複出現多次,而陣列的長度為count 的絕對值。
該操作和SPOP 相似,但SPOP 將隨機元素從集合中移除並返回,而SRANDMEMBER 則僅僅返回隨機元素,而不對集合進行任何改動。
時間複雜度:
只提供 key 引數時為 O(1) 。
如果提供了 count 引數,那麼為 O(N) ,N 為返回陣列的元素個數。
返回值:
只提供 key 引數時,返回一個元素;如果集合為空,返回 nil 。
如果提供了 count 引數,那麼返回一個數組;如果集合為空,返回空陣列。127.0.0.1:6379[15]> SADD fruit apple banana cherry (integer) 3 127.0.0.1:6379[15]> SRANDMEMBER fruit "cherry" 127.0.0.1:6379[15]> SRANDMEMBER fruit "banana" 127.0.0.1:6379[15]> SRANDMEMBER fruit 2 1) "apple" 2) "banana" 127.0.0.1:6379[15]> SRANDMEMBER fruit 3 1) "apple" 2) "banana" 3) "cherry"
SDIFF
SDIFF key [key …]
返回一個集合的全部成員,該集合是所有給定集合之間的差集。
不存在的 key 被視為空集。
時間複雜度: O(N),N 是所有給定集合的成員數量之和。
返回值: 交整合員的列表。127.0.0.1:6379[15]> SADD key_1 1 2 3 (integer) 3 127.0.0.1:6379[15]> SADD key_2 3 4 5 (integer) 3 127.0.0.1:6379[15]> SDIFF key_1 key_2 1) "1" 2) "2"
SDIFFSTORE
SDIFFSTORE destination key [key …]
這個命令的作用和SDIFF 類似,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。
時間複雜度: O(N),N 是所有給定集合的成員數量之和。
返回值: 結果集中的元素數量。127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "3" 2) "4" 3) "5" 127.0.0.1:6379[15]> SDIFFSTORE newkey key_1 key_2 (integer) 2 127.0.0.1:6379[15]> SMEMBERS newkey 1) "1" 2) "2"
SINTER
SINTER key [key …]
返回一個集合的全部成員,該集合是所有給定集合的交集。
不存在的 key 被視為空集。
當給定集合當中有一個空集時,結果也為空集 (根據集合運算定律)。
時間複雜度: O(N * M),N 為給定集合當中基數最小的集合,M 為給定集合的個數。
返回值: 交整合員的列表。127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "3" 2) "4" 3) "5" 127.0.0.1:6379[15]> SINTER key_1 key_2 1) "3"
SINTERSTORE
SINTERSTORE destination key [key …]
這個命令類似於SINTER 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。
時間複雜度: O(N * M),N 為給定集合當中基數最小的集合,M 為給定集合的個數。
返回值: 結果集中的成員數量。127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "3" 2) "4" 3) "5" 127.0.0.1:6379[15]> SINTERSTORE newkey key_1 key_2 (integer) 1 127.0.0.1:6379[15]> SMEMBERS newkey 1) "3"
SUNION
SUNION key [key …]
返回一個集合的全部成員,該集合是所有給定集合的並集。
不存在的 key 被視為空集。
時間複雜度: O(N),N 是所有給定集合的成員數量之和。
返回值: 並整合員的列表。127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "3" 2) "4" 3) "5" 127.0.0.1:6379[15]> SUNION key_1 key_2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
SUNIONSTORE
SUNIONSTORE destination key [key …]
這個命令類似於SUNION 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。
如果 destination 已經存在,則將其覆蓋。
destination 可以是 key 本身。
時間複雜度: O(N),N 是所有給定集合的成員數量之和。
返回值: 結果集中的元素數量。127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "3" 2) "4" 3) "5" 127.0.0.1:6379[15]> SUNIONSTORE newkey key_1 key_2 (integer) 5 127.0.0.1:6379[15]> SMEMBERS newkey 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
SMOVE
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 集合執行,那麼返回127.0.0.1:6379[15]> FLUSHDB OK 127.0.0.1:6379[15]> SADD key_1 1 2 3 (integer) 3 127.0.0.1:6379[15]> SADD key_2 2 (integer) 1 127.0.0.1:6379[15]> SMOVE key_1 key_2 2 (integer) 1 127.0.0.1:6379[15]> SMEMBERS key_2 1) "2" 127.0.0.1:6379[15]> SMOVE key_1 key_2 3 (integer) 1 127.0.0.1:6379[15]> SMEMBERS key_1 1) "1" 127.0.0.1:6379[15]> SMEMBERS key_2 1) "2" 2) "3" 127.0.0.1:6379[15]> SMOVE key_1 key_3 1 (integer) 1 127.0.0.1:6379[15]> SMEMBERS key_1 (empty list or set) 127.0.0.1:6379[15]> SMEMBERS key_3 1) "1"