Redis Set

介紹

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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容