Redis是一个非常流行的内存型数据库,因为Redis数据存储在内存中,所以在过期键的删除策略上面采取了很巧妙的方法来满足缓存需求和释放内存的需求。下面就讨论一下Redis的过期键删除策略。
Redis 过期键的删除策略主要有两种:
1、定期删除(基于时间)
定期删除是指通过Redis设置一个定时器,定期检查所有设置过期时间的键,如果过期就将其删除。默认情况下,Redis每秒执行10次检查key是否到期的操作(即redis默认配置的hz参数) ,会扫描添加了过期时间的15个随机键, 如果找到一个已经过期的键则将其从数据库中删除。
这种方式适用于大多数应用场景,对CPU和内存的消耗比较均衡,但是这样的周期性删除可能会造成短暂的内存波动,所以需要谨慎设置过期时间。
2、惰性删除(基于访问)
惰性删除是指当Redis客户端进行读写操作时,先检查一下键是否过期,如果过期就立刻将其作为删除并且不再提供值返回给客户端。也就是说Redis不会在特定的时间点主动删除过期键,而是等到客户端尝试访问它的时候再判断是否过期。只有当键失效而又没有被占用太长时间时,Redis 的惰性删除才能体现出它的优越性。
这种方式在不产生内存波动和CPU开销的情况下实现了精确控制,相比之下更加灵活高效,但惰性删除可能会导致多个过期键长时间得不到清理并积压,增加了开销。
需要注意的是,在Redis主从架构中,如果一个Slave节点因网络问题,断线过久而没有及时与Master同步数据,此时Master上的过期键已经被及时删除了,但由于Slave还未同步删除操作,这时过期键仍会存在于Slave节点,并且带来了一些隐患,一旦要进行横向扩展或者迁移,则可能涉及到脏数据的传递,所以需要注意处理这种情况。
总结,两种删除策略各有优缺点,需要根据具体应用场景的需求给出合理的配置方案。定期删除可根据内存使用状况来设置对应的删除频率,在降低垃圾回收造成的影响同时也保证内存的持续高效使用。惰性删除则可以通过设置监控机制来保证及时发现延迟清理的情况,以避免过期键的积压和带来的负面影响。