专栏首页码农架构除了手动清理,Redi还有哪些回收策略?
原创

除了手动清理,Redi还有哪些回收策略?

Redis内存回收机制主要体现在以下两个方面:

  • 删除到达时间的键对象。
  • 内存使用达到maxmemory上限时触发内存溢出控制策略。

删除过期键对象

Redis所有的键都可以设置过期属性,内部保存在过期字典中。由于进程内保存了大量的键,维护每个键精准的过期删除机制会导致消耗大量的CPU,对于单线程的Redis来说成本过高,因此Redis采用惰性删除定时任务删除机制实现过期键的内存回收。

  • 惰性删除:惰性删除用于当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护TTL链表来处理过期键的删除。但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。正因为如此,Redis还提供另一种定时任务删除机制作为惰性删除的补充。
  • 定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例,使用快慢两种速率模式回收键。

比如:

  1. 定时任务在每个数据库空间随机检查20个键,当发现过期时删除对应的键。
  2. 如果超过检查数25%的键过期,循环执行回收逻辑直到不足25%或运行超时为止,慢模式下超时时间为25ms。
  3. 如果之前回收键逻辑超时,则在Redis触发内部事件之前再次以快模式运行回收过期键任务,快模式下超时时间为1ms且2s内只能运行1次。
  4. 快慢两种模式内部删除逻辑相同,只是执行的超时时间不同。

内存溢出控制策略

当Redis所用内存达到maxmemory上限时会触发相应的溢出控制策略。具体策略受maxmemory-policy参数控制,Redis支持6种策略,如下所示:

  • noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。推荐使用,目前项目在用这种。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key。应该也没人用吧,你不删最少使用 Key,去随机删。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。不推荐。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。依然不推荐。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。不推荐。如果没有对应的键,则回退到noeviction策略

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 注册Spring Bean:如何将BeanDefinition注册到IoC容器?

    Spring 是如何将BeanDefinition注册到容器,到底我们有多少种方法来操作?

    码农架构
  • Spring应用上下文:ApplicationContext除了IoC容器角色,还提供哪些特性?

    通过上一篇BeanFactory和ApplicationContext比较发现,BeanFactory提供了配置框架和基本功能,ApplicationConte...

    码农架构
  • 设计模式行为型:命令模式(CommandPattern)

    将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(T...

    码农架构
  • 深入浅出——搞懂卷积神经网络误差分析(一)

    第一部分 全连接网络的权值更新   卷积神经网络使用基于梯度的学习方法进行监督训练,实践中,一般使用随机梯度下降(机器学习中几种常见的梯度下降方式)的版本,对于...

    深度学习思考者
  • 腾讯云服务器优惠年付3折起--腾讯云最新优惠分享

    用户4373589
  • 腾讯云学生服务器

    腾讯云学生服务器是腾讯云+校园计划,针对学生提供的特价优惠服务器, 一个月只需10元,就可以购买腾讯云学生服务器

    用户3840209
  • 为什么巨头们都盯上了健康?

    原创2015-03-31罗超 百度健康云近日与北京经信委合作,在玉渊潭樱花节举办一场落地活动:赏樱市民现场体验接入健康云的智能健康检测设备,通过它们免费检测脂肪...

    罗超频道
  • heredoc细节妙用

    END_TEXT被用作标识符。它指定了here文档的开始和结束 ONE TWO THREE和 UNO DOS TRES是执行后 tr的输出。

    PedroQin
  • SpringBoot 系列教程 JPA 错误姿势之环境配置问题

    又回到 jpa 的教程上了,这一篇源于某个简单的项目需要读写 db,本想着直接使用 jpa 会比较简单,然而悲催的是实际开发过程中,发现了不少的坑;本文为错误姿...

    一灰灰blog
  • mysql 正确清理binlog日志

    MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对bi...

    拓荒者

扫码关注云+社区

领取腾讯云代金券