有海量key和value都比较小的数据,在redis中如何存储才更省内存引出Redis内存管理,消耗和优化

内存消耗


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的长度 选择高效的序列化工具 
  • 控制键的数量:
  1. 根据键规模在客户端通过分组映射到一组hash对象中
  2. hash的field可用于记录原始key字符串
  3. hash的value保存原始值结构
  • hash键和field键的设计
  1. 键的离散度高时,按照字符串位截取
  2. 键离散度低,用哈希算法打散键,哈希field存储键的原始值
  3. 尽量减少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.这是简单的数据序列化

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值