1. 程式人生 > >redis 系列13 集合對象

redis 系列13 集合對象

mat 移動 創建 sql sad tor hashtable spa diff

一. 集合對象概述

  這裏的集合是string類型的無序集合,在集合對象中集合成員是唯一的,這就意味著集合中不能出現重復的數據。集合是通過哈希表實現的,集合中最大的成員數為 232-1 (4294967295, 每個集合可存儲40多億個成員)。集合對象的編碼可以是intset或者hashtable。

  1.1 intset編碼

    intset編碼的集合對象使用整數集合作為底層實現,集合對象包含的所有元素都被保存在整數集合裏面。例如下面使用整數集合:

     127.0.0.1:6379> sadd numbers 1 3 5
    (integer) 3
    127.0.0.1
:6379> object encoding numbers "intset"

  1.2 hashtable編碼

     另一個編碼是hashtable,集合對象使用字典作為底層實現,字典的每個鍵都是一個字符串對象,每個字符串對象包含了一個集合元素,而字典的值則全部被設置為null。

    127.0.0.1:6379> sadd furits "apple" "banana"
    (integer) 2
    127.0.0.1:6379> object encoding furits
    "hashtable"

  兩個底層結構如下圖所示,作為字典結構,鍵都是一個字符串對象,值都為NULL。

技術分享圖片

  1.3 編碼轉換

    當集合對象可以同時滿足以下兩個條件時,對象使用intset編碼:(1) 集合對象保存的所有元素都是整數值;(2) 集合對象保存的元素數量不超過512個。當不能滿足這兩個條件的集合對象使用的是hashtable編碼。對於第二個條件的上限值可以通過配置文件中的set-max-intset-entries選項來修改。

   127.0.0.1:6379> config get set-max-intset-entries
	1) "set-max-intset-entries"
	2) "512"

  

二. 集合命令實現

-- Sadd 命令將一個或多個成員元素加入到集合中,已經存在於集合的成員元素將被忽略。
    
127.0.0.1:6379> sadd myset "hello" "foo" (integer) 2 -- Scard 命令返回集合中元素的數量 127.0.0.1:6379> scard myset (integer) 2 -- Sdiff 命令返回給定集合之間的差集, 返回包含差集成員的列表。下面是返回myset1對比myset2,返回myset1的差集。 127.0.0.1:6379> sadd myset1 "hello" "foo" "bar" (integer) 3 127.0.0.1:6379> sadd myset2 "hello" "world" (integer) 2 127.0.0.1:6379> sdiff myset1 myset2 1) "foo" 2) "bar" -- Sdiffstore 命令將差集存儲在指定的集合中,如果指定的集合(destination) key已存在,則會被覆蓋, 下面集合key為 destset不存在,創建該新集合並且新集合值為二個集合的差集。 。 127.0.0.1:6379> sdiffstore destset myset1 myset2 (integer) 2 127.0.0.1:6379> smembers destset 1) "foo" 2) "bar" -- Sinter 命令返回給定所有給定集合的交集,與Sdiff相反。下面返回myset1和myset2二個集合共同有的值。 127.0.0.1:6379> sinter myset1 myset2 1) "hello" -- Sinterstore命令將給定集合之間的交集存儲在指定的集合中。如果指定的集合已經存在,則將其覆蓋, 與Sdiffstore 相反。下面集合key為 destset2不存在,創建該新集合並且新集合值為二個集合的交集。 127.0.0.1:6379> sinterstore destest2 myset1 myset2 (integer) 1 127.0.0.1:6379> smembers destest2 1) "hello" -- Sismember 命令判斷成員元素是否是集合的成員。如果成員元素是集合的成員,返回 1127.0.0.1:6379> sismember myset1 "hello" (integer) 1 -- Smembers 命令返回集合中的所有的成員。 不存在的集合 key 被視為空集合。 127.0.0.1:6379> smembers myset1 1) "hello" 2) "bar" 3) "foo" -- Smove 命令將指定成員 member 元素從 source 集合移動到 destination 集合,SMOVE 是原子性操作。 127.0.0.1:6379> smembers myset1 1) "hello" 2) "bar" 3) "foo" 127.0.0.1:6379> smembers myset2 1) "hello" 2) "world" 127.0.0.1:6379> smove myset1 myset2 "bar" --將myset1的元素移到myset2中 (integer) 1 127.0.0.1:6379> smembers myset1 -- myset1中少了"bar"元素 1) "hello" 2) "foo" 127.0.0.1:6379> smembers myset2 --myset2 中多了"bar" 元素 1) "hello" 2) "world" 3) "bar" --Spop 命令用於隨機移除指定count元素數量,並返回集合中的移出的元素。 127.0.0.1:6379> smembers myset1 1) "three" 2) "one" 3) "hello" 4) "two" 127.0.0.1:6379> spop myset1 3 --隨機移除3個 1) "hello" 2) "two" 3) "three" 127.0.0.1:6379> smembers myset1 --只剩下一個元素 1) "one" --Srem 命令用於移除集合中的一個或多個成員元素,不存在的成員元素會被忽略。 127.0.0.1:6379> smembers myset1 1) "three" 2) "one" 3) "two" 127.0.0.1:6379> srem myset1 "one" --移除指定元素 (integer) 1 127.0.0.1:6379> smembers myset1 --只剩下二個元素 1) "three" 2) "two" --Sunion 命令返回給定集合的並集,相當於sql中的join合並去重。 127.0.0.1:6379> smembers myset2 1) "one" 2) "two" 127.0.0.1:6379> smembers myset1 1) "three" 2) "two" 127.0.0.1:6379> sunion myset2 myset1 --返回合並後的元素 1) "three" 2) "one" 3) "two" -- Sunionstore 命令將給定集合的並集,存儲在指定的集合 destination 中。 127.0.0.1:6379> sunionstore myset myset2 myset1 (integer) 3 127.0.0.1:6379> smembers myset --並集後,存儲到了myset集合中 1) "three" 2) "one" 3) "two -- Sscan 命令用於叠代集合鍵中的元素 127.0.0.1:6379> smembers myset 1) "three" 2) "one" 3) "two" 127.0.0.1:6379> sscan myset 0 match t* 1) "0" 2) 1) "three" 2) "two"

  

redis 系列13 集合對象