Redis 数据过期后的删除策略是什么?
Redis 数据过期后的删除策略是什么?
回答重点
Redis 数据过期主要有两种删除策略,分别为定期删除、惰性删除两种:
- 定期删除:Redis 每隔一定时间(默认是 100 毫秒)会随机检查一定数量的键,如果发现过期键,则将其删除。这种方式能够在后台持续清理过期数据,防止内存膨胀。
- 惰性删除:在每次访问键时,Redis 检查该键是否已过期,如果已过期,则将其删除。这种策略保证了在使用过程中只删除不再需要的数据,但在不访问过期键时不会立即清除。
扩展知识
定期删除细节
定期删除策略是 Redis 内部的一个定时任务,周期性(每 100ms)地扫描一些设置了过期时间的键。
要注意,Redis 并不会一次性扫描所有设置了过期时间的键,因为这样会消耗大量的 CPU 资源。它会在每次扫描时限制扫描的时间和数量,以避免对性能产生过大的影响,因此可能会有部分键过期了没有被及时删除。
每次获取 20 个 key 判断是否过期,如果发现过期的 key 占比超过 25% 则继续再拉 20 个,如果小于 25% 则停止。这里还有一个时间限制,即一次删除时间不超过 25ms,即如果发现占比超过 25% 的时候,需要判断目前是否已经花了 25ms,如果已经用了这么多时长也会结束。
惰性删除优缺点
- 优点:可以减少 CPU 的占用,因为只有查询到了相关的数据才执行删除操作,不需要主动去定时删除。
- 缺点:如果一直没有查询一个 Key,就有可能不会被删除,这样就容易造成内存泄漏问题。
内存回收机制
实际上,除了这两个删除,还有一个机制也会淘汰 key,即当 Redis 内存使用达到设置的 maxmemory 限制时,会触发内存回收机制。
此时会主动删除一些过期键和其他不需要的键,以释放内存。具体的删除策略有以下几种:
- volatile-lru: 从设置了过期时间的键中使用 LRU(Least Recently Used,最近最少使用)算法删除键。
- allkeys-lru: 从所有键中使用 LRU 算法删除键。
- volatile-lfu: 从设置了过期时间的键中使用 LFU(Least Frequently Used,最少使用频率)算法删除键。
- allkeys-lfu: 从所有键中使用 LFU 算法删除键。
- volatile-random: 从设置了过期时间的键中随机删除键。
- allkeys-random: 从所有键中随机删除键。
- volatile-ttl: 从设置了过期时间的键中根据 TTL(Time to Live,存活时间)删除键,优先删除存活时间短的键。
- noeviction: 不删除键,只是拒绝写入新的数据。
Redis 在正常情况下对过期键的处理就是惰性删除 + 定期删除一起使用,主动删除(内存回收)其实属于异常的兜底处理了。
Redis 键过期时间的设置
- EXPIRE:设置键的过期时间(以秒为单位)。
- PEXPIRE:设置键的过期时间(以毫秒为单位)。
- SETEX:在设置键值的同时定义过期时间。
- PSETEX:类似于 SETEX,但支持毫秒级的过期时间。
Comments