惰性删除(Lazy Expiration)和定期删除(Periodic Expiration)是Redis处理键过期的两种策略,它们共同作用以确保过期数据能够被有效地清理,但主要针对的是带有过期时间的键。
-
惰性删除:
当客户端尝试访问一个键时,Redis服务器才会检查这个键是否已经过期。如果发现该键已过期,则在返回结果前立即将其从数据库中删除。这种策略节省了CPU资源,因为它只在访问时才进行检查和删除操作,但存在可能长时间不访问而导致内存无法及时释放的风险。 -
定期删除:
Redis会周期性地主动查找并删除一部分已过期的键,避免大量过期键长期占用内存空间。例如,默认情况下Redis每秒随机抽取一定数量的键检查它们的过期时间,并删除已过期的键。这种方式可以补充惰性删除的不足,即使长时间没有客户端访问也能自动清理部分过期数据。
至于Redis的淘汰策略(Eviction Policy),它主要涉及当Redis实例的内存达到最大限制时如何选择删除无过期时间的键以释放内存空间,与过期键的删除机制不同。常见的淘汰策略有以下几种:
- LRU(Least Recently Used 最近最少使用):优先删除最近最少使用的键。
- LFU(Least Frequently Used 最少频率使用):优先删除使用频率最低的键。
- TTL(基于生存时间的淘汰):仅在设置了过期时间的数据上应用,实际上这并不算严格意义上的“淘汰”策略,而是结合了过期机制来自动回收内存。
- volatile-lru/volatile-lfu/volatile-random/volatile-ttl:这些是混合策略,仅对有过期时间设置的键采用LRU、LFU、随机或基于TTL的方式进行淘汰。
综上所述,惰性删除和定期删除是用于处理有过期时间设定的键的删除方式,而Redis的淘汰策略主要用于解决未设置过期时间的键在内存满载时的内存管理问题。