【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

Redis 过期策略的演变:从早期策略到当前方法 (redis过期键删除策略)

用户投稿2024-04-19热门资讯16

Redis 是一个流行的键值存储数据库,广泛用于缓存、会话管理和消息传递等各种用例。Redis 的一个关键特性是过期策略,它允许用户为存储在数据库中的键设置过期时间,以便在过期后自动删除。

多年来,Redis 的过期策略一直处于不断演变之中,不同的版本引入了不同的策略来提高效率和可扩展性。本文将概述 Redis 过期策略的演变,从早期策略到当前方法。

早期策略:直到需要时才检查

在 Redis 的早期版本中,过期策略非常简单:只有在实际需要时才会检查键的过期时间。换句话说,如果一个键长时间未被访问,Redis 不会主动检查它是否已过期。这种方法被称为「直到需要时才检查」策略。

直到需要时才检查策略的优点是效率高,因为它只在需要时才执行额外的工作。它的缺点是可能导致数据库中累积大量过期的键,这可能会影响性能并消耗不必要的内存。

被动删除:定期检查

为了解决「直到需要时才检查」策略的缺点,Redis 2.0 引入了被动删除策略。此策略引入了一个后台线程,该线程定期扫描数据库以查找过期的键。如果找到过期的键,则将其标记为要删除。

被动删除策略比「直到需要时才检查」策略更主动,因为它定期检查过期的键。它仍然是一种相对低效的方法,因为它需要扫描整个数据库。

主动删除:惰性删除

Redis 过期策略的演变:从早期策略到当前方法 (redis过期键删除策略) 第1张

Redis 2.8 引入了惰性删除策略,这是一种比被动删除更主动的过期策略。惰性删除策略使用一个特殊的「过期键字典」来跟踪所有有过期时间的键。当客户端试图访问一个键时,Redis 会检查该键是否在过期键字典中。如果找到


Redis过期键删除策略和内存淘汰策略

惰性删除+定期删除 键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除 对内存不友好,对CPU友好 redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除 中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次 中的maxmemory-samples参数用来指定每次检测几条数据,默认5 对CPU不友好,对内存友好 中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。 redis提供了8种内存淘汰策略: no-eviction:当内存达到最大后,新数据不能写入,会报错 allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略) allkeys-random:当内存达到最大后,随机淘汰 allkeys-lfu:当内存达到最大后,淘汰最少使用的数据 volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据 volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰 volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据 volatitle-ttl:当内存达到最大后,淘汰最早过期的数据 标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。 标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。 redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。 redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。 后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。 为什么需要LFU算法? 现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。 为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。 原理如下: LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。 但是这样又有新的问题: ①新的key如果计数器为0,可能就会一直被淘汰 redis解决方案:redis给每个新的键的计数器一个初始值 ②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。 redis解决方案:如果某个键一段时间不使用,计数器会减小

Redis缓存过期机制

一、针对与设置了过期时间的key值 1.(主动)定期删除:定时随机的检查过期的key,如果过期则清理删除 (每秒检查的次数1-500)配置: hz 10 2.(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除 所以,虽然key过期了,但是没被清理的话,还是会占内存的。 二、内存淘汰管理机制Memory Management 当内存占满之后,redis提供缓存淘汰机制。 : maxmemory <bytes> * noeviction:旧缓存永不过期,新缓存设置不了,返回错误 * allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用) * allkeys-random:在所有的缓存中随机删除(不推荐) * volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存 * volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存 * volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的

Redis过期删除策略和内存淘汰策略

Redis可以用使用 expire 指令设置过期时间,在Redis内部,每当我们设置一个键的过期时间时,Redis就会将该键带上过期时间存放到一个过期字典中。当我们查询一个键时,Redis便首先检查该键是否存在过期字典中,如果存在,那就获取其过期时间。然后将过期时间和当前系统时间进行比对,比系统时间大,那就没有过期;反之判定该键过期。

那对于过期数据,一般有三种方式进行处理:

Redis的过期删除策略: 惰性删除 和 定期删除 两种策略配合使用。

spring-boot-starter-data-redis 包中提供了监听过期的类,对于key过期,需要得到通知,做业务处理的,可以做此监听。

springboot整合Redis参考, SpringBoot整合Redis -() 在整合Redis的基础上,在新加监听配置

监听配置类

监听类

将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。

Redis中有6种淘汰策略:

文件中配置策略,有2个地方:

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

Redis 过期策略的演变:从早期策略到当前方法 (redis过期键删除策略) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!