Redis 过期策略的演变:从早期策略到当前方法 (redis过期键删除策略)
Redis 是一个流行的键值存储数据库,广泛用于缓存、会话管理和消息传递等各种用例。Redis 的一个关键特性是过期策略,它允许用户为存储在数据库中的键设置过期时间,以便在过期后自动删除。
多年来,Redis 的过期策略一直处于不断演变之中,不同的版本引入了不同的策略来提高效率和可扩展性。本文将概述 Redis 过期策略的演变,从早期策略到当前方法。
早期策略:直到需要时才检查
在 Redis 的早期版本中,过期策略非常简单:只有在实际需要时才会检查键的过期时间。换句话说,如果一个键长时间未被访问,Redis 不会主动检查它是否已过期。这种方法被称为「直到需要时才检查」策略。
直到需要时才检查策略的优点是效率高,因为它只在需要时才执行额外的工作。它的缺点是可能导致数据库中累积大量过期的键,这可能会影响性能并消耗不必要的内存。
被动删除:定期检查
为了解决「直到需要时才检查」策略的缺点,Redis 2.0 引入了被动删除策略。此策略引入了一个后台线程,该线程定期扫描数据库以查找过期的键。如果找到过期的键,则将其标记为要删除。
被动删除策略比「直到需要时才检查」策略更主动,因为它定期检查过期的键。它仍然是一种相对低效的方法,因为它需要扫描整个数据库。
主动删除:惰性删除
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个地方:
若对本页面资源感兴趣,请点击下方或右方图片,注册登录后
搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源
如有其他疑问,请咨询右下角【在线客服】,谢谢支持!
相关文章
- 让您的海报脱颖而出:利用海报生成器的力量进行影响深远的视觉效果 (让您的海报脱颖而出)
- 用海报生成器将您的想法变为现实:轻松创建专业的宣传材料 (用海报生成器怎么做)
- 突破创意界限:海报生成器为您的视觉表达增添活力 (突破创意界限的例子)
- 赋能营销人员和设计师:海报生成器的强大工具,用于创意设计 (赋能营销人员风控措施)
- 让您的内容脱颖而出:使用海报生成器制作引人注目的视觉效果 (让您的内容脱颖而出)
- 为您的活动打造引人注目的宣传材料:海报生成器就是您的秘密武器 (为您的活动打卡怎么写)
- 释放您的创造力:利用海报生成器探索无限可能 (释放您的创造力英语)
- 使用海报生成器创建令人惊叹的视觉效果 (使用海报生成视频软件)
- 让您的图像说出话来:探索在线图片制作平台的惊人力量 (让您的图像说出来英语)
- 告别平庸:掌握在线图片制作的艺术,打造惊人的视觉效果 (告别平庸的自己)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~