1. 程式人生 > >Redis資料型別之SET型別

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型別-常見命令

  1. 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"
  2. 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)
  3. 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"
  4. 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
  5. 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
  6. 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"
  7. 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"
  8. 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"
  9. 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"
  10. 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"
  11. 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"
  12. 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"
  13. 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"
  14. 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"