it编程 > 数据库 > Redis

Redis的过期策略以及内存淘汰机制详解

14人参与 2025-04-23 Redis

在谈redis过期概念时,先抛出几个问题:

那么代入问题,根据概念思考这几个问题吧

redis有三种数据过期策略:定时删除,惰性删除,定期删除

​​​一、过期策略

1、惰性删除

当读/写一个已经过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除掉这个key

简而言之:就是当被读写的时候,再判断是否过期再删除

对于过期的key不作任何处理,当获取key时检查key是否过期,过期就删除,否则直接返回。

2、定时删除

由于惰性删除策略无法保证冷数据被及时的删掉,所以redis会定期(默认每100ms)主动淘汰一批已过期的key,这里的一批只是部分过期的key,所以可能会出现部分key已经过期但是还没有被清理掉的情况,导致内存没有被及时释放

简而言之:每隔一定时间删除

在设置key的过期时间时设置定时器,当key过期时通过定时器删除key。

3、定期删除

redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 cpu 带来很大的负载

简而言之:随机每隔一定时间删除

定时删除和惰性删除的这种方案,每隔一段时间检查redis中过期的key,并通过限制删除执行的时长和频率。

redis使用的是定期删除+惰性删除的策略,在合理使用cpu和避免内存浪费之间平衡

定期删除+惰性删除存在的问题

如果某个key过期后,定期删除没删除成功,然后也没再次去请求key,也就是说惰性删除也没生效。这时,如果大量过期的key堆积在内存中,redis的内存会越来越高,导致redis的内存块耗尽。那么就应该采用内存淘汰机制

二、内存淘汰机制

​​​1、内存淘汰策略

redis key没设置过期时间为什么被redis主动删除了?

当redis已用内存超过maxmemory限定时,就会触发主动清理策略

在 redis.conf 中有一行配置:

# maxmemory-policy noeviction

redis的默认淘汰策略是noeviction

执行流程如下

主动清理策略在redis4.0之前一共实现了8种内存淘汰策略

a)针对设置了过期时间的key做处理:

b)针对所有的key做处理:

c)不处理:

一旦缓存被写满,再有写请求进来,redis就不再提供服务,而是直接返回错误。redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓存空间,我们不把它用在 redis 缓存中

​​​2、内存淘汰算法

从内测淘汰策略分类上,我们可以得知,除了随机删除和不删除之外,主要有两种淘汰算法:lru 算法和 lfu 算法

绝大多数情况,使用lru算法,当存在大量热点缓存数据时,lfu可能更好点

三、lazy-free机制

lazy-free 特性是 redis 4.0 开始引入的,指的是让 redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程

目的是减少删除键时对主线程的影响,从而提高 redis 的整体性能。

lazy free 主要有两种应用场景:

lazy free 与缓存淘汰的关系

虽然 lazy free 不是缓存淘汰机制的一部分,但在缓存淘汰过程中,lazy free 可以用来优化缓存淘汰操作的执行方式,减少对 redis 性能的影响。具体来说:

1、减少主线程阻塞:

在缓存淘汰策略中,当 redis 需要删除键来释放内存时,使用 lazy free 可以减少主循环的阻塞时间。这是因为删除操作是在后台线程中完成的,而不是立即执行

2、提高性能:

lazy free 可以帮助提高 redis 的性能,特别是在高负载的情况下,因为它减少了删除操作对主线程的影响。

3、与缓存淘汰策略的交互:

当 redis 需要根据缓存淘汰策略删除键时,如果启用了 lazy free,那么这些删除操作可能会被异步执行,这有助于减少对客户端请求的延迟影响

例子:假设 redis 的缓存淘汰策略配置为 allkeys-lru,并且启用了 lazy free

当 redis 达到最大内存限制时,它会根据 lru 策略选择一些键来删除。

如果这些键满足 lazy free 的条件(例如,使用了 unlink 命令或配置了相应的 lazy free 选项),那么这些键的删除操作将在后台异步执行,而不是立即在主线程中执行

也就是说如果没有lazy free,执行缓存淘汰策略时,删除键的操作将会同步执行,可能会阻塞主线程,影响其他客户端的请求

四、相关问题

好了,来解决上面抛出的问题

1:redis 给缓存数据设置过期时间?

(1)redis的内存是有限的

(2)某些业务场景需要某些数据在一段时间后过期

2:redis 是如何判断数据是否过期的呢?

3:大量 key 集中过期怎么办?

如果存在大量 key 集中过期的问题,可能会使 redis 的请求延迟变高。可以采用下面的可选方案来应对:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Redis之Key过期策略的用法解读

04-23

Redis如何设置过期时间

04-23

redis之数据过期清除策略、缓存淘汰策略详解

04-23

Nginx location匹配模式与规则详解

04-23

CentOS7更改默认SSH端口与配置指南

04-23

Nginx反向代理重写URL的实现方案

04-23

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论