Redis 的内存淘汰策略和过期删除策略是其内存管理的重要组成部分。以下是对这两个策略的描述及其工作流程:
过期删除策略
Redis 使用了一种称为“惰性删除”和“定期删除”相结合的方式管理过期键。
惰性删除
当客户端访问一个键时,Redis 会检查这个键是否设置了过期时间。如果键已过期,Redis 会删除这个键,并返回相应的信息给客户端。这种方式的特点是只有在键被访问时才会检查是否过期,因此称为“惰性删除”。
定期删除
为了避免过期键过多导致内存占用过大,Redis 会使用一个定时任务,在后台异步地遍历各个数据库,检查并删除过期的键。这个定时任务的执行频率可以通过 hz
参数控制,默认是 10 次/秒。
内存淘汰策略
当 Redis 的内存使用超过配置的最大值时,Redis 会根据配置的内存淘汰策略来移除一些键,以释放内存。
以下是 Redis 支持的内存淘汰策略:
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。这是默认的淘汰策略。
- allkeys-lru:移除最近最少使用的 key(LRU,Least Recently Used)。
- allkeys-random:随机移除某个 key。
- volatile-lru:移除最近最少使用的 key,但仅限于设置了过期时间的 key。
- volatile-random:随机移除某个设置了过期时间的 key。
- volatile-ttl:移除剩余生存时间(TTL)较短的 key,但仅限于设置了过期时间的 key。
- allkeys-lfu:移除最近最不常用的 key(LFU,Least Frequently Used)。
淘汰流程
- 当 Redis 需要进行内存淘汰时,它会根据配置的内存淘汰策略选择合适的键进行删除。
- 如果选择了 LRU 或 LFU 策略,Redis 会根据键的使用频率或最近使用时间来选择需要删除的键。
- 如果选择了随机删除策略,Redis 会随机选择一个键进行删除。
- 一旦选定了需要删除的键,Redis 会将其从内存中删除,并释放相应的内存空间。
需要注意的是,内存淘汰是一种紧急措施,应该尽量避免频繁触发。在实际应用中,应该通过合理的数据结构设计、使用合适的持久化策略以及监控和优化 Redis 的内存使用来减少内存淘汰的发生。