介紹
set 是無序集合,最大可以包含(2 的 32 次方-1)個(gè)元素。set 的是通過 hash table 實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。hash table 會隨著添加或者刪除自動(dòng)的調(diào)整大小。需要注意的是調(diào)整 hash table 大小時(shí)候需要同步(獲取寫鎖)會阻塞其他讀寫操作。可能不久后就會改用跳表(skip list)來實(shí)現(xiàn)。hash table 會隨著添加或者刪除自動(dòng)的調(diào)整大小。需要注意的是調(diào)整 hash table 大小時(shí)候需要同步(獲取寫鎖)會阻塞其他讀寫操作??赡懿痪煤缶蜁挠锰恚╯kip list)來實(shí)現(xiàn)。
REDIS_SET (集 合) 是 SADD 、 SRANDMEMBER 等 命 令 的 操 作 對 象, REDIS_ENCODING_INTSET 和 REDIS_ENCODING_HT 兩種方式編碼:

第一個(gè)添加到集合的元素,決定了創(chuàng)建集合時(shí)所使用的編碼:如果第一個(gè)元素可以表示為 long long 類型值(也即是,它是一個(gè)整數(shù)),那么集合的初始編碼為 REDIS_ENCODING_INTSET 。否則,集合的初始編碼為 REDIS_ENCODING_HT 。
如果一個(gè)集合使用 REDIS_ENCODING_INTSET 編碼,那么當(dāng)以下任何一個(gè)條件被滿足時(shí),這個(gè)集合會被轉(zhuǎn)換成 REDIS_ENCODING_HT 編碼:intset 保存的整數(shù)值個(gè)數(shù)超過 server.set_max_intset_entries (默認(rèn)值為 512 )。試圖往集合里添加一個(gè)新元素,并且這個(gè)元素不能被表示為 long long 類型(也即是,它不是一個(gè)整數(shù))。

指令
SADD key member [member ...]
將一個(gè)或多個(gè)?member?元素加入到集合?key?當(dāng)中,已經(jīng)存在于集合的?member?元素將被忽略。
假如?key?不存在,則創(chuàng)建一個(gè)只包含?member?元素作成員的集合。
當(dāng)?key?不是集合類型時(shí),返回一個(gè)錯(cuò)誤。
SREM key member [member ...]
移除集合?key?中的一個(gè)或多個(gè)?member?元素,不存在的?member?元素會被忽略。
當(dāng)?key?不是集合類型,返回一個(gè)錯(cuò)誤。
SPOP key
移除并返回集合中的一個(gè)隨機(jī)元素。
如果只想獲取一個(gè)隨機(jī)元素,但不想該元素從集合中被移除的話,可以使用?SRANDMEMBER?命令。
SRANDMEMBER key [count]
如果命令執(zhí)行時(shí),只提供了?key?參數(shù),那么返回集合中的一個(gè)隨機(jī)元素。
從 Redis 2.6 版本開始,?SRANDMEMBER?命令接受可選的?count?參數(shù):
如果?count?為正數(shù),且小于集合基數(shù),那么命令返回一個(gè)包含?count?個(gè)元素的數(shù)組,數(shù)組中的元素各不相同。如果?count?大于等于集合基數(shù),那么返回整個(gè)集合。
如果?count?為負(fù)數(shù),那么命令返回一個(gè)數(shù)組,數(shù)組中的元素可能會重復(fù)出現(xiàn)多次,而數(shù)組的長度為?count?的絕對值。
該操作和?SPOP?相似,但?SPOP?將隨機(jī)元素從集合中移除并返回,而?SRANDMEMBER?則僅僅返回隨機(jī)元素,而不對集合進(jìn)行任何改動(dòng)。
SDIFF key [key ...]
返回一個(gè)集合的全部成員,該集合是所有給定集合之間的差集(集合之間不同的元素)。
不存在的?key?被視為空集。

SDIFFSTORE destination key [key ...]
這個(gè)命令的作用和?SDIFF?類似,但它將結(jié)果保存到?destination?集合,而不是簡單地返回結(jié)果集。
如果?destination?集合已經(jīng)存在,則將其覆蓋。
destination?可以是?key?本身。

SMEMBERS key
返回集合?key?中的所有成員。
不存在的?key?被視為空集合。
SINTER key [key ...]
返回一個(gè)集合的全部成員,該集合是所有給定集合的交集。
不存在的?key?被視為空集。
當(dāng)給定集合當(dāng)中有一個(gè)空集時(shí),結(jié)果也為空集(根據(jù)集合運(yùn)算定律)。

SINTERSTORE destination key [key ...]
這個(gè)命令類似于?SINTER?命令,但它將結(jié)果保存到?destination?集合,而不是簡單地返回結(jié)果集。
如果?destination?集合已經(jīng)存在,則將其覆蓋。
destination?可以是?key?本身。

SUNION key [key ...]
返回一個(gè)集合的全部成員,該集合是所有給定集合的并集。
不存在的?key?被視為空集。

SUNIONSTORE destination key [key ...]
這個(gè)命令類似于?SUNION?命令,但它將結(jié)果保存到?destination?集合,而不是簡單地返回結(jié)果集。
如果?destination?已經(jīng)存在,則將其覆蓋。
destination?可以是?key?本身。

SCARD key
返回集合?key?的基數(shù)(集合中元素的數(shù)量)。
SMOVE source destination member
將?member?元素從?source?集合移動(dòng)到?destination?集合。
SMOVE?是原子性操作。
如果?source?集合不存在或不包含指定的?member?元素,則?SMOVE?命令不執(zhí)行任何操作,僅返回?0?。否則,?member?元素從?source?集合中被移除,并添加到?destination?集合中去。
當(dāng)?destination?集合已經(jīng)包含?member?元素時(shí),?SMOVE?命令只是簡單地將?source?集合中的?member?元素刪除。
當(dāng)?source?或?destination?不是集合類型時(shí),返回一個(gè)錯(cuò)誤。
SISMEMBER key member
判斷?member?元素是否集合?key?的成員。
SSCAN key cursor [MATCH pattern] [COUNT count]
增量式迭代命令并不保證每次執(zhí)行都返回某個(gè)給定數(shù)量的元素。增量式命令甚至可能會返回零個(gè)元素, 但只要命令返回的游標(biāo)不是?0?, 應(yīng)用程序就不應(yīng)該將迭代視作結(jié)束。
COUNT:雖然增量式迭代命令不保證每次迭代所返回的元素?cái)?shù)量, 但我們可以使用?COUNT?選項(xiàng), 對命令的行為進(jìn)行一定程度上的調(diào)整?;旧?,?COUNT?選項(xiàng)的作用就是讓用戶告知迭代命令, 在每次迭代中應(yīng)該從數(shù)據(jù)集里返回多少元素。雖然?COUNT?選項(xiàng)只是對增量式迭代命令的一種提示(hint), 但是在大多數(shù)情況下, 這種提示都是有效的。
MATCH:和?KEYS?命令一樣, 增量式迭代命令也可以通過提供一個(gè) glob 風(fēng)格的模式參數(shù), 讓命令只返回和給定模式相匹配的元素, 這一點(diǎn)可以通過在執(zhí)行增量式迭代命令時(shí), 通過給定?MATCH?<pattern>?參數(shù)來實(shí)現(xiàn)。
