代码改变世界

Redis 缓存过期和删除策略

2026-01-22 10:07  abce  阅读(2)  评论(0)    收藏  举报

 

Redis 实现了多种过期删除策略,用来高效管理内存并确保最佳性能。理解这些机制对于构建可扩展的高性能应用至关重要。

Redis采用懒惰删除与主动删除策略的组合方案。它不会立即删除过期键,而是运用智能算法在性能与内存使用之间取得平衡。

 

过期删除的核心策略

1.惰性删除(Lazy Deletion)

惰性删除是主要机制,过期键仅在被访问时才会被移除。当客户端尝试访问键时,Redis会检查该键是否已过期,若已过期,则立即删除该键并返回NULL;不会进行后台扫描或主动删除。

 

惰性删除的优点:

·CPU开销极低

·无需后台处理

·适用于高频访问的键值

 

惰性删除的缺点:

·过期键值若永不被访问将造成内存浪费

·内存使用模式难以预测

2.主动删除(Active Deletion)

Redis定期扫描并清除过期键值以防止内存膨胀。Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)​。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例、使用快慢两种速率模式回收键。

 

算法实现细节:

·Redis每秒运行约10次过期检测循环

·每次循环从过期字典中随机抽取20个键值对

·若过期键值占比超25%,则重复执行上面的流程

·单次循环执行时间受限,以避免阻塞

image (2)

配置

# Redis configuration for active expiration
hz 10                    # Frequency of background tasks (10 Hz = 10 times/second)
active-expire-effort 1   # CPU effort for active expiration (1-10)

 

 

Redis 过期策略(驱逐策略)

当 Redis 达到内存限制时,会采用驱逐策略来释放空间:

# Configuration in redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru

1.策略类型

(1)noeviction(默认)

·不驱逐任何键

·内存达到上限时写入操作返回错误

·适用场景:不可丢失的关键数据

(2)allkeys-lru

·从所有键中移除最近最少使用的键

·适用场景:通用缓存场景

(3)allkeys-lfu

·移除访问频率最低的键

·适用场景:具有独特访问模式的应用程序

(4)volatile-lru

仅从设置了过期时间的键中移除最近最少使用键

适用场景:持久数据与临时数据混合存储

易失性-最近最少使用

(5)volatile-lfu

仅从设置了过期时间的键中移除访问频率最低的键

(6)allkeys-random

·随机移除键

适用场景:访问模式不可预测时

(7)volatile-random

随机移除设置了过期时间的键

(8)volatile-ttl

优先移除生存时间(TTL)最短的键

适用场景:时间敏感数据优先级处理

2.策略选择指导

image (3)

 

主从集群过期机制

在Redis集群中,过期处理遵循特定模式。

 

主从过期流程:

·仅主节点执行主动过期循环

·主节点向从节点发送显式DEL命令

·从节点不独立执行键过期(惰性删除机制除外)

image (4)