Redis In Action 笔记(七)降低内存使用
短结构
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 协议》,转载必须注明作者和本文链接
推荐文章: