短結構
list
,hash
,zset
長度較小的時候,可以使用一種名為ziplist
的緊湊方式儲存——以序列化方式儲存,需編碼和解碼。關於ziplist
的配置選項如下:
list-max-ziplist-entries 512 # 被編碼為ziplist情況下允許包含的最大元素,下同
list-max-ziplist-value 64 # ziplist每個節點最大體積(位元組),下同
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
當資料超出以上設定的值,Redis就會將ziplist編碼轉為其他結構,記憶體佔用也會因此增加。
ziplist(壓縮列表)
用於list
,hash
,zset
。
判斷一個結構是否被表示為ziplist:
使用debug_object
檢視特定物件相關資訊。
Python命令列互動模式下,執行程式碼(redis版本為3.2.100):
>>> import redis
>>> conn =redis.Redis(host='127.0.0.1', port=6379)
>>> conn.rpush('test', 'a', 'b', 'c', 'd')
4
>>> conn.debug_object('test')
{'type': 'Value', 'at': '00007FE13CC6AEB0', 'refcount': 1, 'encoding': 'quicklist', 'serializedlength': 25, 'lru': 2104644, 'lru_seconds_idle': 12, 'ql_nodes': '1', 'ql_avg_node': '4.00', 'ql_ziplist_max': '-2', 'ql_compressed': '0', 'ql_uncompressed_size': '23'}
可以看出儲存的編碼方式為:quicklist
,佔用25個位元組的記憶體。(原書為ziplist,24個位元組)。
*解釋:Redis 將連結串列和 ziplist 結合起來組成了 quicklist。 也就是將多個 ziplist
使用雙向指標串起來使用。
inset(整數集合)
用於set
。配置選項:set-max-intset-entries 512
,表示使用inset
時能夠包含的最大元素數。inset
太大時,會被轉換為hash table
:
>>> conn.sadd('set-object', *range(5000))
4500
>>> conn.debug_object('set-object')
{'type': 'Value', 'at': '00007FE13CC6AEC0', 'refcount': 1, 'encoding': 'hashtable', 'serializedlength': 14874, 'lru': 2106406, 'lru_seconds_idle': 5}
可以看出,該set
的編碼方式為hashtable
。
設定ziplist合理的範圍
ziplist
長度限制在500-2000個元素內,並將每個元素體積限制在128位元組以下。
原書作者的實踐:1024個元素之內,每個元素體積不能超過64個位元組。
另外,保持鍵名簡短,也可以節省記憶體。
分片結構(sharding)
類似資料表的分表
打包儲存二進位制位和位元組
高效打包和更新redis字串的四個命令:GETRANG
,SETRANG
,GETBIT
,SETBIT
。
本作品採用《CC 協議》,轉載必須註明作者和本文連結