Redis集合類型
- 2019 年 10 月 11 日
- 筆記
今天我們了解一下Redis中的集合類型,也就是set集合。在Redis中set也是可以保存多個字元串的。那麼set集合和list鏈表到底有什麼不同呢?下面我們重點介紹一下它們之間的不同。
- set中的元素是不可以重複的,而list是可以保存重複元素的。
- set中的元素是無序的,而list中的元素是有序的。
- set中的元素不能通過索引下標獲取元素,而list中的元素則可以通過索引下標獲取元素。
- 除此之外set還支援更高級的功能,例如多個set取交集、並集、差集、等等。
下面我們介紹一下set中的相關命令。
命令
一、集合內操作
1.添加元素
sadd key member [member ...]

sadd命令也是有返回值的,它的返回值就是當前執行sadd命令成功添加元素的個數,因為set中不能保存重複元素,所以在執行:
sadd setkey c d
命令時,返回的是1,而不是2。因為元素c,已經成功保存到set中,不在繼續保存了,只能將d保存到set中。
2.刪除元素
srem key member [member ...]

srem命令和sadd命令一樣也是有返回值的,返回值就是當前刪除元素的個數。
3.計算元素個數
scard key

scard命令的時間複雜度為O(1),scard命令不會遍歷set中的所有元素,而是直接使用Redis中的內部變數。
4.判讀元素是否在集合中
sismember key member

sismember命令也有返回值,如果返回值為1則表示當前元素在當前set中,如果返回0則表示當前元素不在set中。
5.隨機從set中返回指定個數元素
srandmember key [count]

srandmember命令中有一個可選參數count,count參數指的是返回元素的個數,如果當前set中的元素個數小於count,則srandmember命令返回當前set中的所有元素,如果count參數等於0,則不返回任何數據,如果count參數小於0,則隨機返回當前count個數的元素,不管當前set中的元素個數為多少。
6.從集合中隨機彈出元素
spop key [count]

spop命令也是隨機從set中彈出元素,並且也支援count可選參數,但有一點和srandmember命令不同。spop命令在隨機彈出元素之後,會將彈出的元素從set中刪除,而srandmember命令則不同,只會隨機彈出元素,並不會將元素從set中刪除。
7.獲取所有元素
smembers key

smembers命令雖然能獲取當前set中所有的元素,但smembers命令返回元素的順序與sadd添加元素的順序不一定相同,這也就是前面提到過的保存在set中的元素是無序的。
二、集合間操作
1.集合的交集
sinter key [key ...]

2.集合的並集
sunion key [key ...]

3.集合的差集
sdiff key [key ...]

4.將集合的交集、並集、差集的結果保存
sinterstore destination key [key ...] sunionstore destination key [key ...] sdiffstore destination key [key ...]

為什麼Redis要提供了sinterstore、sunionstore、sdiffstore命令來將集合的交集、並集、差集的結果保存起來呢?這是因為Redis在進行上述比較時,會比較耗費時間,所以為了提高性能可以將交集、並集、差集的結果提前保存時來,這樣在需要使用時,可以直接通過smembers命令獲取。
下面我們看一下set中相關命令的時間複雜度。

內部編碼
- intset(整數集合):當集合中的元素都是整數,並且集合中的元素個數小於512個時,Redis會選用intset作為底層內部實現。
- hashtable(哈希表):當條件不滿足上述時,Redis會採用hashtable作為底層實現。
備註:我們可以通過set-max-intset-entries參數來設置上述中的默認參數。
下面我們看一下具體的事例,來驗證我們上面提到的內部編碼。

1.當元素個數較少並且都是整數時,內部編碼為intset。

2.當元素不全是整數時,內部編碼為hashtable。
3.當元素個數超過512個時,內部編碼為hashtable。


上述命令就是Redis中的集合相關的知識,如有不正確的地方歡迎指出,謝謝。