Set對象編碼是 intset 或者 hashtable。
1、intset
intset 編碼的集合對象使用整數集合作為底層實現,集合對象包含的所有元素都被保存在整數集合里面。
舉個例子,以下代碼將創建一個intset 編碼集合對象:
2、hashtable
hashtable 編碼的集合對象使用字典作為底層實現,字典的每個鍵都是一個字符串對象,每個字符串對象包含了一個集合元素,而字典的值則全部被設置為 NULL。
舉個例子,以下代碼將創建一個 hashtable 編碼集合對象:
3、編碼轉換
當Set對象可以同時滿足以下兩個條件時,則使用 intset 編碼:
1)Set對象保存的所有元素都是整數值;
2)Set對象保存的元素數量不超過 512 個(默認值,配置參數set-max-intset-entries可以修改);
不能滿足這兩個條件的Set對象需要使用 hashtable 編碼。
注意:第二個條件的上限值是可以修改的,具體請看配置文件。
set-max-intset-entries 選項的說明:對於使用 intset 編碼的Set對象來說,當使用 intset 編碼所需兩個條件的任意一個不能被滿足時,對象的編碼轉換操作就會被執行,原本保存在整數集合中的所有元素都會被轉移並保存到字典里面,並且對象的編碼也會從 intset 變為 hashtable。
示例1: 不滿足“所有元素都是整數值”
示例2: 不滿足“元素數量不超過 512 個”
4、要點總結
1)Set對象的編碼可以是 intset 或者 hashtable;
2)intset 編碼的集合對象使用整數集合作為底層實現;
3)hashtable 編碼的集合對象使用字典(map)作為底層實現;
4)intset 與 hashtable 編碼之間,符合條件的情況下可以轉換。