内存消耗
used_memory_human:983.98M
used_memory_rss:1096163328
used_memory_peak_human:1017.11M
used_memory_lua:35840
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
- 对象内存:存储用户所有key-value数据
- 缓冲内存:客户端缓冲,复制积压缓冲区,AOF缓冲区
- 内存碎片:默认内存分配器:jemalloc
内存回收策略
删除到达过期时间的键对象:
惰性删除(客户端读取时检查删除)
定时任务删除
- noeviction:默认,拒绝写入
- volatile-lru:LRU删除超时键
- allkeys-lru:LRU删除所有键
- allkeys-random:随机删除所有键
- volatile-random:随机删除过期键
- volatile-ttl:删除最近将要过期数据
redisObject对象
Redis优化
- 缩减键值对象:降低Redis内存使用最直接的方法:缩减key和value的长度 选择高效的序列化工具
- 控制键的数量:
- 根据键规模在客户端通过分组映射到一组hash对象中
- hash的field可用于记录原始key字符串
- hash的value保存原始值结构
- hash键和field键的设计
- 键的离散度高时,按照字符串位截取
- 键离散度低,用哈希算法打散键,哈希field存储键的原始值
- 尽量减少hash键和field的长度,如使用部分键内容
内存优化场景(面试):
场景:有海量key和value都比较小的数据,在redis中如何存储才更省内存。
原理:通过大幅减少key的数量来降低内存的消耗。
实现:hash hset,在客户端通过分组将海量的key根据一定的策略映射到一组hash对象中,由于value较小,故hash类型的对象会使用占用内存较小的ziplist编码。
eg:如存在100万个键,可以映射到1000个hash中,每个hash保存1000个元素。
参考查阅资料
https://stackoverflow.com/questions/12779372/hset-vs-set-memory-usage
http://www.voidcn.com/article/p-fsmrzxhx-btp.html
取决于hash-max-ziplist-entries和hash-max-ziplist-value参数的值,将小型散列对象编码为ziplists.这是简单的数据序列化