Redis如何过期key

本文深入探讨了Redis中过期key的两种处理方式:被动过期和主动过期。被动过期仅在客户端尝试访问已过期key时进行清理,而主动过期则采用概率算法定期检查并删除过期key,确保内存效率。文章详细解释了主动过期的具体实现,包括其检查频率、抽样数量及过期率阈值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过期redis key有两种方式:被动和主动方式。

被动过期:当一些客户端要访问这个key时,发现它已经过期,则删除。

显然这样做是不够的,因为可能有些key不会被再次访问。这种情况下也同样要删除这些过期的key。因此就有了主动过期的方式。

主动过期:redis会定期,通过随机的方式在设置了过期时间的key中选择一些key,如果这些key已经超过过期时间则把他们从keyspace中删除。

Redis每秒钟会做10次这样的事情:

  1. 从设置了过期时间的key集合中测试20个随机的key。
  2. 删除所有过期的key。
  3. 如果超过25%的key过期,则从第1步开始。

这是一个简单的概率算法,基于我们的抽样对于整个key空间具有代表性。直到过期率低于25%。

翻译自 https://redis.io/commands/expire

### Redis 过期 Key 的处理机制 Redis 中的过期 Key 主要通过两种方式进行处理:惰性删除和定期删除。 #### 惰性删除 当客户端尝试访问某个 Key 时,如果发现该 Key 已经过期,则会在返回结果之前将其删除。这种方式的优点是不会主动占用 CPU 资源去扫描和删除过期 Key,缺点是在高并发场景下可能会导致大量已过期但尚未被访问的 Key 占用内存资源[^1]。 ```python def lazy_deletion(key): if is_expired(key): # 判断key是否已经过期 delete_key(key) # 删除过期key ``` #### 定期删除 为了弥补惰性删除可能带来的内存浪费问题,Redis 实现了一种定时任务,在后台周期性地检查并删除部分过期 Key。这种机制的核心在于选取一定数量的数据库分片(database slots),从中随机抽取若干 Keys 并逐一判断它们是否需要被清除。虽然这种方法无法一次性彻底清理所有过期数据,但它能够在一定程度上缓解内存压力[^2]。 ```c void active_expire_cycle() { int dbs_per_call = REDIS_EXPIRE_DBS_PER_CALL; // 数据库轮询次数 while (dbs_per_call--) { int j; for (j = 0; j < REDIS_EXPIRE_SAMPLE_KEYS; j++) { // 抽样样本数 sds key = getRandomKey(); if (is_expired(key)) { server.db->expires[key]--; freeMemoryIfNeeded(); // 如果必要则释放内存 } } } } ``` 这两种方法各有优劣,实际应用中通常会结合使用以达到最佳效果。对于某些特殊需求的应用程序来说,还可以利用订阅发布模式配合 Lua 脚本等方式自定义更复杂的逻辑来应对业务层面的需求[^4]。 另外值得注意的是,在采用 LRU 或 LFU 等淘汰策略管理有限容量内的对象集合时,即使设置了合理的 TTL 值也不能完全避免因突发流量而导致缓存击穿的风险。因此建议开发者们根据实际情况合理规划存储结构以及预估峰值负载情况下的表现特性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值