Redis的过期策略及其优缺点
Redis 的过期策略是指 Redis 如何处理设置了过期时间的键值对。Redis主要有两种过期策略:惰性删除、定期删除,以及一种辅助机制内存淘汰策略。
惰性删除(被动删除)
原理:惰性删除是Redis最简单的过期策略,也是默认的过期。当客户端尝试访问一个已过期的键时,Redis会检查该键是否已过期,如果已过期,则立即删除该键,并返回空值。
优点:
按需清理,减少CPU开销:只有在访问过期键时才会触发删除操作,减少了不必要的删除开销。在高并发场景下,这种按需清理的方式可以避免因频繁扫描过期键而导致的CPU资源浪费。
缺点:
- 内存泄漏问题:如果大量过期键在被访问之前一直未被访问,这些键会一直占用内存空间,可能导致内存泄漏问题。
- 突发访问压力:当大量过期键同时被访问时,可能会导致瞬间的高负载,影响系统性能。
适用场景:适用于对内存占用要求不高,且过期键访问频率较高的场景。
定期删除(主动删除)
原理:Redis会定期检查并删除已过期的键。每次检查会随机选择一定数量的键进行过期检查和删除。具体流程如下:
-
随机抽样:从每个数据库中随机选取一定数量的键(默认每次检查20个键)。
-
删除判断:若超过25%的抽样键已过期,则重复抽样和删除过程,直至比例低于25%或达到时间限制。
-
频率控制:通过配置hz参数调整每秒执行的定期任务次数(默认10次/秒),平衡CPU和内存效率。
-
hz 10 # 默认值,可调整为 1~500(通常不超过 100)
优点:
及时释放内存:通过定期检查,能够及时删除过期键,释放内存空间,避免内存被无用数据占用,也避免了集中式的扫描带来的性能问题。
缺点:
- 内存占用波动:由于定期删除的频率和数量有限,可能会导致内存占用在某些时刻较高,尤其是在过期键较多时。
- CPU资源占用:定期检查和删除操作会占用一定的CPU资源,尤其是在过期键较多的情况下。
适用场景:适用于对内存占用有一定要求,且需要及时释放过期键内存的场景。
内存淘汰策略(辅助机制)
原理:当内存达到maxmemory限制时,Redis会根据配置的淘汰策略删除键,即使部分键未过期。定期淘汰策略可以根据不同的内存淘汰算法进行配置,常见的有:
maxmemory 4gb # 设置 Redis 最大内存限制(如 4GB:maxmemory 4gb)
maxmemory-policy volatile-ttl # 常用策略:优先删除 TTL 短的键
- volatile-ttl:优先删除剩余存活时间(TTL)最短的键。
- volatile-lru:在设置过期时间的键中,删除最近最少使用的(LRU)。
- volatile-lfu:在设置过期时间的键中,删除最不经常使用的(LFU)。
- allkeys-lru/allkeys-lfu:从所有键中按LRU/LFU淘汰。
- volatile-random/allkeys-random:随机删除键。
- noeviction(默认):拒绝写入新数据,直到释放足够内存。
优点:
- 主动管理内存:通过主动淘汰未过期但占用较多内存的键,能够更有效地管理内存,避免内存不足导致的问题。
- 灵活性高:可以根据不同的业务需求选择合适的淘汰算法,灵活配置内存管理策略。
缺点:
- 复杂度高:实现机制较为复杂,需要配置和管理不同的淘汰算法。
- 数据丢失风险:可能会导致一些未过期但重要的键被误淘汰,需要谨慎配置。
适用场景:适用于内存资源有限,且需要主动管理内存的场景,例如在高并发、大数据量的分布式系统中。