Redis如何删除已过期key
答案是通过定期删除+惰性删除
定期删除
Redis每100ms会在内存中随机选取一部分key进行检查,将已经过期的删除,为什么只随机检查一部分,而不是全部检查呢?那当然是怕数据过大,导致Redis变慢甚至崩掉啊…你想想,假设每100ms扫描几十万数据,redis怕不是直接人没了
惰性删除
看到这,估计你心里会产生问题,如果不能保证key一过期就能被删除,那我岂不是能取到已经过期的key?那设置过期时间还有啥意义?放心,你是取不到过期数据的,因为还有惰性删除这一关等着过期key呢,当你每一次获取key的时候,Redis都会检查该key是否已过期,如果过期了,那就直接删除,不会返回任何东西给你,所以通过这个惰性删除能保证你不会取到过期key
定期删除+惰性删除的问题
定期删除中存活下来一些key,然后你又一直没有去获取或者去操作这些key让他们走惰性删除,那么这些key就会越堆越多,最后把内存都堆满了,这时候咋办呢?这时候就要用到淘汰策略了
淘汰策略
淘汰策略都是在redis.conf中下面这一行配置
maxmemory-policy volatile-lru(自选)
有以下淘汰策略提供选择
- noeviction :当内存不足时写入数据,直接给你报错,这种属于没啥人用的,简直太暴力了,一点也不优雅~
- allkeys-lru :当内存不足时写入数据,Redis会干掉最近最少使用的key,这个是主流解决方案,精准而优雅~
- allkeys-random :当内存不足时写入数据,Redis会随机干掉某倒霉key,这是属于把问题抛给上帝,也就比第一个解决方案好一丶丶吧
- volatile-lru :当内存不足以写入数据时,从过期key中删除最近最少使用的key,据说用这个的也不多,为啥呢?我的理解是重点是先把空间清出来,清理最少用的数据最好,那些过期的key反正也过不了惰性删除这一关
- volatile-random :当内存不足以写入数据时,从过期key中让上帝选某个删除,一般没人喜欢把问题交给上帝吧
- volatile-ttl :当内存不足以写入数据时,从过期key中选最早过期的key删除,这个方法我觉得不行