Redis In Action 筆記(七)降低記憶體使用

tsin發表於2019-07-06

短結構

listhashzset長度較小的時候,可以使用一種名為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(壓縮列表)

用於listhashzset

判斷一個結構是否被表示為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字串的四個命令:GETRANGSETRANGGETBITSETBIT

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Was mich nicht umbringt, macht mich stärker

相關文章