Redis集合類型

今天咱們瞭解一下Redis中的集合類型,也就是set集合。在Redis中set也是能夠保存多個字符串的。那麼set集合和list鏈表到底有什麼不一樣呢?下面咱們重點介紹一下它們之間的不一樣。redis

  • set中的元素是不能夠重複的,而list是能夠保存重複元素的。
  • set中的元素是無序的,而list中的元素是有序的。
  • set中的元素不能經過索引下標獲取元素,而list中的元素則能夠經過索引下標獲取元素。
  • 除此以外set還支持更高級的功能,例如多個set取交集、並集、差集、等等。

下面咱們介紹一下set中的相關命令。性能


命令編碼

1、集合內操做spa

1.添加元素code

sadd key member [member ...]

img

sadd命令也是有返回值的,它的返回值就是當前執行sadd命令成功添加元素的個數,由於set中不能保存重複元素,因此在執行:索引

sadd setkey c d

命令時,返回的是1,而不是2。由於元素c,已經成功保存到set中,不在繼續保存了,只能將d保存到set中。utf-8


2.刪除元素rem

srem key member [member ...]

img

srem命令和sadd命令同樣也是有返回值的,返回值就是當前刪除元素的個數。字符串


3.計算元素個數get

scard key

img

scard命令的時間複雜度爲O(1),scard命令不會遍歷set中的全部元素,而是直接使用Redis中的內部變量。


4.判讀元素是否在集合中

sismember key member

img

sismember命令也有返回值,若是返回值爲1則表示當前元素在當前set中,若是返回0則表示當前元素不在set中。


5.隨機從set中返回指定個數元素

srandmember key [count]

img

srandmember命令中有一個可選參數count,count參數指的是返回元素的個數,若是當前set中的元素個數小於count,則srandmember命令返回當前set中的全部元素,若是count參數等於0,則不返回任何數據,若是count參數小於0,則隨機返回當前count個數的元素,無論當前set中的元素個數爲多少。


6.從集合中隨機彈出元素

spop key [count]

img

spop命令也是隨機從set中彈出元素,而且也支持count可選參數,但有一點和srandmember命令不一樣。spop命令在隨機彈出元素以後,會將彈出的元素從set中刪除,而srandmember命令則不一樣,只會隨機彈出元素,並不會將元素從set中刪除。


7.獲取全部元素

smembers key

img

smembers命令雖然能獲取當前set中全部的元素,但smembers命令返回元素的順序與sadd添加元素的順序不必定相同,這也就是前面提到過的保存在set中的元素是無序的。


2、集合間操做

1.集合的交集

sinter key [key ...]

img


2.集合的並集

sunion key [key ...]

img


3.集合的差集

sdiff key [key ...]

img


4.將集合的交集、並集、差集的結果保存

sinterstore destination key [key ...]
sunionstore destination key [key ...]
sdiffstore destination key [key ...]

img

爲何Redis要提供了sinterstore、sunionstore、sdiffstore命令來將集合的交集、並集、差集的結果保存起來呢?這是由於Redis在進行上述比較時,會比較耗費時間,因此爲了提升性能能夠將交集、並集、差集的結果提早保存時來,這樣在須要使用時,能夠直接經過smembers命令獲取。


下面咱們看一下set中相關命令的時間複雜度。

命令 時間複雜度
sadd key member [member ...] O(k),k是元素的個數
srem key member [member ...] O(k),k是元素的個數
scard key O(1)
sismember key member O(1)
srandmember key [count] O(count)
spop key [count] O(1)
smembers key O(n),n是元素的總數
sinter key [key ...] O(m * k),k是多個集合中元素最少的個數,m是鍵個數
sunion key [key ...] O(k),k是多個元素個數和
sdiff key [key ...] O(k),k是多個元素個數和
sinterstore destination key [key ...] O(m * k),k是多個集合中元素最少的個數,m是鍵個數
sunionstore destination key [key ...] O(k),k是多個元素個數和
sdiffstore destination key [key ...] O(k),k是多個元素個數和

內部編碼

  • intset(整數集合):當集合中的元素都是整數,而且集合中的元素個數小於512個時,Redis會選用intset做爲底層內部實現。
  • hashtable(哈希表):當條件不知足上述時,Redis會採用hashtable做爲底層實現。

備註:咱們能夠經過set-max-intset-entries參數來設置上述中的默認參數。


下面咱們看一下具體的事例,來驗證咱們上面提到的內部編碼。

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


2.當元素不全是整數時,內部編碼爲hashtable。
img


3.當元素個數超過512個時,內部編碼爲hashtable。

import redis

r = redis.Redis(host='127.0.0.1', port=6379)

if r.object('encoding', 'setkey') != None:
    print('Key爲【setkey】的字節編碼爲【%s】' % r.object('encoding', 'setkey').decode('utf-8'))

for i in range(1, 600):
    r.sadd('setkey', i)

if r.object('encoding', 'setkey') != None:
    print('Key爲【setkey】的字節編碼爲【%s】' % r.object('encoding', 'setkey').decode('utf-8'))
Key爲【setkey】的字節編碼爲【intset】
Key爲【setkey】的字節編碼爲【hashtable】

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


原文連接:http://jilinwula.com/article/...

相關文章
相關標籤/搜索