生产环境的问题:春节前后,redis内存占用率持续飙升
从业务端排查,并没有大量的新增key缓存,但是redis监控上能看到增加了几百万的key。
因为key数量达到了6000万,怀疑是过期key不能及时释放内存导致。
粗暴验证:
在低峰时段执行keys xxxx*命令遍历key,几秒后kill掉命令,发现redis key数量减少了,内存占用也降低了,说明问题原因和猜测的一致。
延展问题:
Redis里面如果有大量的key,怎样才能高效的找出过期的key并将其删除呢,难道是遍历每一个key吗(keys命令确实能触发内存释放)?假如同一时期过期的key非常多,Redis会不会因为一直处理过期事件,而导致读写指令的卡顿?
答:
keys *命令确实会阻塞其他命令的执行,导致慢查询。
那Redis是怎么解决的呢?
Redis4.0新增了lazy free特性,从根本上解决Big Key(主要指定元素较多集合类型Key)删除的风险。lazy free可译为惰性删除或延迟释放;当删除键的时候,redis提供异步延时释放key内存的功能