使用redis碰到maxmemory
最近碰到一个问题,在测试环境高并发调用生产数据,等到数据清理的定时任务完成时,仍然发现大量的数据未被清理,占用较大内存空间。
因为我的key之间会有关联关系,分析残留的数据,发现数据的关联关系并不完整,不完整的数据不能被寻址所以最终残留下来了。
查看redis内存信息:
> info memory
# Memory
maxmemory:14000000000
...
used_memory_peak_human:13.04G
刚开始没注意,后来发现maxmemory的单位是byte,按照1024换算是13.038G,而下面的used_memory_peak_human:13.04G表示内存已经达到过峰值,峰值就是maxmemory!
经过多番资料查找,参考:https://blog.csdn.net/codetomylaw/article/details/50017633,我环境的redis配置就是allkeys-random。
> config get maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-random"
所以,罪魁祸首就是redis在达到上限后随机删除了部分key,导致数据链不完整。
解决办法:根据redis maxmemory和单位数据的大小计算可容纳的数据个数,在redis达到峰值前做好保护,主动清理最老的数据。