本文已参与[新人创作礼]活动,一起开启掘金创作之路。
关于zipList介绍
Redis hash可以作为字典实现,在存储优化上Hash有优化算法,称为ziplist(Redis 2.6之前称为zipmap)。该压缩算法能够优化节省内存,ziplist也用于优化排序set和list集合的存储。
当一个hash压偏到这样一个压缩过的集合中时,类似这样排列[key1, value1,key2,value2,...]带有一些key的Hash能够被打包进入线性数组结构,同时保证get和set时的O(1) 性能。
这种方式很显然不会随着hash字段增加时能够保持这样的性能,当hash增长时,它会被转为标准的字典结构来维持O(1)性能,而空间节省特性就会失效,Redis配置参数会控制这个转换:
- list-max-ziplist-entries 默认 (512): 如果hash增长大于这个限制值,将改变到标准模式(字典)
- list-max-ziplist-value 默认 (64): 当hash中最大元素超过这个限制值,hash将改变到标准模式
因此为了节约内存,推荐使用hash替代普通字符串的使用,这就能利用Redis强大的hash特性,因此,请尽可能使用hash,小的hash将被编码使用小的空间
举例如下:
场景:需要存储click和imp事件对应的数量
- 采用Hash格式存储数据如下
hset test_mem click 1 imp 1
- 采用String格式存储数据如下
set test_mem_click 1
set test_mem_imp 1
查询以上两种数据占用的内存大小
localhost:0>memory usage test_mem
83
localhost:0>memory usage test_mem_imp
56
localhost:0>memory usage test_mem_click
56
通过验证 56+56>83,因此采用hash将更节省内存