Redis In Action 笔记(七)降低内存使用

短结构

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
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!