99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Redis 集合對象

2018-08-02 14:49 更新

集合對象的編碼可以是 intset 或者 hashtable 。

intset 編碼的集合對象使用整數(shù)集合作為底層實現(xiàn), 集合對象包含的所有元素都被保存在整數(shù)集合里面。

舉個例子, 以下代碼將創(chuàng)建一個如圖 8-12 所示的 intset 編碼集合對象:

redis> SADD numbers 1 3 5
(integer) 3

另一方面, hashtable 編碼的集合對象使用字典作為底層實現(xiàn), 字典的每個鍵都是一個字符串對象, 每個字符串對象包含了一個集合元素, 而字典的值則全部被設(shè)置為 NULL 。

舉個例子, 以下代碼將創(chuàng)建一個如圖 8-13 所示的 hashtable 編碼集合對象:

redis> SADD fruits "apple" "banana" "cherry"
(integer) 3

編碼的轉(zhuǎn)換

當(dāng)集合對象可以同時滿足以下兩個條件時, 對象使用 intset 編碼:

  1. 集合對象保存的所有元素都是整數(shù)值;
  2. 集合對象保存的元素數(shù)量不超過 512 個;

不能滿足這兩個條件的集合對象需要使用 hashtable 編碼。

注意

第二個條件的上限值是可以修改的, 具體請看配置文件中關(guān)于 set-max-intset-entries 選項的說明。

對于使用 intset 編碼的集合對象來說, 當(dāng)使用 intset 編碼所需的兩個條件的任意一個不能被滿足時, 對象的編碼轉(zhuǎn)換操作就會被執(zhí)行: 原本保存在整數(shù)集合中的所有元素都會被轉(zhuǎn)移并保存到字典里面, 并且對象的編碼也會從 intset 變?yōu)?nbsp;hashtable 。

舉個例子, 以下代碼創(chuàng)建了一個只包含整數(shù)元素的集合對象, 該對象的編碼為 intset :

redis> SADD numbers 1 3 5
(integer) 3

redis> OBJECT ENCODING numbers
"intset"

不過, 只要我們向這個只包含整數(shù)元素的集合對象添加一個字符串元素, 集合對象的編碼轉(zhuǎn)移操作就會被執(zhí)行:

redis> SADD numbers "seven"
(integer) 1

redis> OBJECT ENCODING numbers
"hashtable"

除此之外, 如果我們創(chuàng)建一個包含 512 個整數(shù)元素的集合對象, 那么對象的編碼應(yīng)該會是 intset :

redis> EVAL "for i=1, 512 do redis.call('SADD', KEYS[1], i) end" 1 integers
(nil)

redis> SCARD integers
(integer) 512

redis> OBJECT ENCODING integers
"intset"

但是, 只要我們再向集合添加一個新的整數(shù)元素, 使得這個集合的元素數(shù)量變成 513 , 那么對象的編碼轉(zhuǎn)換操作就會被執(zhí)行:

redis> SADD integers 10086
(integer) 1

redis> SCARD integers
(integer) 513

redis> OBJECT ENCODING integers
"hashtable"

集合命令的實現(xiàn)

因為集合鍵的值為集合對象, 所以用于集合鍵的所有命令都是針對集合對象來構(gòu)建的, 表 8-10 列出了其中一部分集合鍵命令, 以及這些命令在不同編碼的集合對象下的實現(xiàn)方法。


表 8-10 集合命令的實現(xiàn)方法

命令 intset 編碼的實現(xiàn)方法 hashtable 編碼的實現(xiàn)方法
SADD 調(diào)用 intsetAdd 函數(shù), 將所有新元素添加到整數(shù)集合里面。 調(diào)用 dictAdd , 以新元素為鍵, NULL 為值, 將鍵值對添加到字典里面。
SCARD 調(diào)用 intsetLen 函數(shù), 返回整數(shù)集合所包含的元素數(shù)量, 這個數(shù)量就是集合對象所包含的元素數(shù)量。 調(diào)用 dictSize 函數(shù), 返回字典所包含的鍵值對數(shù)量, 這個數(shù)量就是集合對象所包含的元素數(shù)量。
SISMEMBER 調(diào)用 intsetFind 函數(shù), 在整數(shù)集合中查找給定的元素, 如果找到了說明元素存在于集合, 沒找到則說明元素不存在于集合。 調(diào)用 dictFind 函數(shù), 在字典的鍵中查找給定的元素, 如果找到了說明元素存在于集合, 沒找到則說明元素不存在于集合。
SMEMBERS 遍歷整個整數(shù)集合, 使用 intsetGet 函數(shù)返回集合元素。 遍歷整個字典, 使用 dictGetKey 函數(shù)返回字典的鍵作為集合元素。
SRANDMEMBER 調(diào)用 intsetRandom 函數(shù), 從整數(shù)集合中隨機(jī)返回一個元素。 調(diào)用 dictGetRandomKey 函數(shù), 從字典中隨機(jī)返回一個字典鍵。
SPOP 調(diào)用 intsetRandom 函數(shù), 從整數(shù)集合中隨機(jī)取出一個元素, 在將這個隨機(jī)元素返回給客戶端之后, 調(diào)用 intsetRemove 函數(shù), 將隨機(jī)元素從整數(shù)集合中刪除掉。 調(diào)用 dictGetRandomKey 函數(shù), 從字典中隨機(jī)取出一個字典鍵, 在將這個隨機(jī)字典鍵的值返回給客戶端之后, 調(diào)用dictDelete 函數(shù), 從字典中刪除隨機(jī)字典鍵所對應(yīng)的鍵值對。
SREM 調(diào)用 intsetRemove 函數(shù), 從整數(shù)集合中刪除所有給定的元素。 調(diào)用 dictDelete 函數(shù), 從字典中刪除所有鍵為給定元素的鍵值對。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號