1、内存回收

1.1过期key回收

首先由2种方式:惰性回收和周期回收

1.11惰性删除

惰性删除是什么意思?也就是在查询时候再去删除。比方说:对于一个键值对,我们设置了ttl过期时间对吧,等到ttl到期了,那么实际上这个键值对还是没有被删除的,直到这个键被查询时,才会判断ttl是否过期,如果过期,那么就在内存里删除这个键值对,返回nil给查询结果。

1.12周期删除

周期删除是什么?字面意思时一定周期就会删除,实际上也确实是这样。

然而周期删除并没有这么简单。周期删除分成2种,有FAST模式和SLOW模式。

1.121SLOW模式和SLOW模式

无论是FAST模式还是SLOW模式,都会查询键值对的ttl,判断是否过期,如果过期就把他删除掉。

这个是怎么查询键值对呢?总不能凭空来查询吧?实际上是有一个定时任务,周期性地抽样删除Key.

SLOW和FAST模式不一样,抽样地周期不一样,另外还有些运作地机制也不一样,

下面来详细介绍FAST模式:

对于SLOW模式,每秒执行10次,这里的10可以使用hz变量来表示。

假如说每秒10次,那么说1s / 10 = 100ms,也就是每次不会超过100ms,然后这100ms里实际上查询删除的耗时也不是完全是100ms,实际上是不大于25ms。也就是说每次执行的间隔不超过100ms。

对于FAST模式,执行的频率不固定,每次2次执行的间隔不超过2ms,实际上执行查询删除的耗时也不会把这2ms利用完,真真利用的不超过1ms.

这里的主要频率都是这样了。

那么细节部分怎么思考?

实际上对于为什么SLOW模式没有利用完100ms,在方法论层次也是有原因的,100ms完全是执行查询删除的操作,那么什么是停下来呢?肯定会有一个过程是停下来的,或者说是执行停下来的操作,而这个停下来的操作也不是可以很快就可以停下来的,于是100ms里的75ms就基本上是去让redis去干其他内容去了。

这里的查询的细节是抽取key很多吗?实际上是还有很多key没搜索到了,只是抽样20个key来判断ttl是否过期。这里就是对于查询的细节。

实际上呢对于这个25ms里的查询,还有一个这样的规则:20个样本查询完毕,而且超此时时间小于25ms,如果要被删除的key如果超过占总key的10%,那么就会继续抽样,反之就会结束。对于FAST模式也一样。

对于FAST模式,过期KEY小于10%,那么就结束。

1.2内存淘汰策略

个人思考:

首先对于为什么会有内存淘汰策略?我们先说一下为什么过期key的处理为什么有2种,一种是惰性删除,一种是周期删除?因为如果只使用惰性删除,那么很多没查询且过期的key就无法被清理,会导致内存不足。于是就会出现周期删除,周期删除就可以将那些很久都没输查询过且ttl过期的key删除掉。惰性删除可能导致过期key的囤积,导致内存不足。于是周期删除应运而生。但是周期删除也不过是抽样删除对吧?SLOW模式一次抽20个来删除,FAST的执行时间更短,抽样就不知道抽多少来删除了,如果更少的话也许会出现误判没有超过10%的比例,于是就结束删除操作,于是删除的速率就低了,这样子还是有可能会导致极限短时间无法清理大量过期的key,容易内存被过期key占满。于是内存淘汰策略应运而生。这个是个人的理解,而对于事实上会不会这样,还有待验证。

正式来看看内存淘汰策略:

这里对于上面过期key回收得不及时,导致内存容易被占满,那么内存淘汰策略就有用武之地了。这里内存淘汰为什么会出现呢?出现这个操作的时间一般是什么时候呢?对于上面说的漏洞,也就是key回收不及时,内存即将被占满就很不妙了,那么内存淘汰策略的开始时间就很明显了,也就是党内存达到一个阈值时,内存淘汰模式便会启动。

而内存淘汰策略细分是有8种的,如下:

noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu、volatile-lfu。

实际上可以说是3类,为什么呢?因为对于noeviction这个实际上是默认不删除,这个可能暂时觉得有点鸡助。

对于random,这个是什么意思?这个是随机抽样,抽到了就删除,感觉可能会把一些比较重要的key也删除了,于是感觉这个策略也弱鸡。

而对于random是由2种策略的,一个是allkey-random一个是volatile-random.这两个策略的区别是随机挑选要删除的key的范围不一样。什么范围不一样?对于redis管理的键值对不是有2类吗?一类设置了ttl,另外一类就是不设置过期时间,于是没过期时间的键值对的ttl等于-1。而allkey就是对于所有key都可以随机抽出来删除。对于volatile-random这个策略,就是对设置了ttl的键值对进行随机删除。

其余剩下的策略就是剩下5种了,实际上这5种可以说成是3类,对于volatile-ttl便是一类(1种),对于lru是一类(2种),lfu是第三类(2种)。

而对于volatile-ttl,这里的作用域应该是很清晰了吧,不就是对于设置了ttl的key进行删除吗?对的是这样的。

对于lru这类淘汰策略是什么呢?先查看一下它的单词意思吧:least recently used

也就是最少最近使用过的删除意思,是删除最小最近时间使用过的key,也就是使用当前时间戳减上一次使用的时间戳,差值越大,那么说明上一次使用的时间戳越小,删除时间戳最大的。这里的最少也就是上次时间戳的使用时间最小。

对于lfu是什么意思呢?转英文看看:least frequently used

也就是使用频率最小的删除掉即可。

lfu这个策略其实还是蛮有趣的,哪里有趣呢?这里不是说删除最小频率使用的吗?那么频率怎么算呢?这里对于统计的对象是频率就很有意思,为什么是统计频率而不是其他值,比如说频数,频数值是无上限的于是不如频率,另外频数也是反应不了每时每刻的频率。于是使用频率作为删除策略的核心实在是太有意思了。

而对于频率的计算也是很有意思的,这个频率最小是0,频率在每个时间段都是不一样的对吧?于是对于最近使用次数较多的key,那么它的频率就增加,而一旦使用得比较少了,这个频率值便会减小。

对于与增加和减小的公式就算了,不用看的这么细,sqlboy直接拿来就用好吧。

浅看Redis内存回收相关推荐

  1. Redis内存回收策略

    Redis 也会因为内存不足而产生错误,也可能因为回收过久而导致系统长期的停顿,因此掌握执行回收策略十分有必要.在 Redis 的配置文件中,当 Redis 的内存达到规定的最大值时,允许配置 6 种 ...

  2. Redis内存回收和持久化策略

    概述 Redis所有数据都存在内存中,在某些时候需要对占用的内存空间进行回收,内存回收主要分为两类,一类是key过期,一类是内存使用达到上限,触发内存淘汰. Key过期策略 要实现key过期,有几种思 ...

  3. Redis 内存回收策略

    Redis的内存回收机制主要体现在以下两个方面: 删除到达过期时间的键对象. 内存使用达到maxmemory上限时触发内存溢出控制策略. 过期删除策略 删除策略的目标:在内存占用与CPU占用之间寻找一 ...

  4. redis内存回收——过期、淘汰

    DB结构 删除策略 惰性删除 周期删除 SLOW FAST 淘汰策略 redis内存设置过大时会增加同步等操作的复杂度 DB结构 /* Redis database representation. T ...

  5. Redis 内存回收

    文章目录 1.过期删除 1.1.过期删除策略 惰性删除 定时删除 2.内存淘汰 2.1.内存淘汰策略 在 RedisDB 利用两个 dict 分别来记录 key-value 和 key-TTL. 对应 ...

  6. Redis的内存回收机制和数据过期淘汰策略

    本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...

  7. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  8. redis内存淘汰和持久化_REDIS的淘汰机制与持久化

    1. 理解淘汰机制 1.1. 内存回收策略 Redis内存回收机制主要体现在以下两个方面: 1. 删除到达时间的键对象. 2. 内存使用达到maxmemory上限时触发内存溢出控制策略. 1.1.1. ...

  9. 内存回收在嵌入式系统应用方面的调研和总结

    前传 嵌入式系统的内存回收还是比较重要的,因为这块涉及到程序运行性能. 嵌入式系统(比如平板,手机)会更加关注单机性能优化,因而会更加重视系统内存回收. 嵌入式系统不像互联网那种大型分布式服务器系统, ...

最新文章

  1. 扩增子统计绘图1箱线图:Alpha多样性
  2. adobe photoshop cc 复制css链接
  3. 利用Sigar获取系统信息
  4. hashmap 和 hashtable 的区别和联系
  5. Hamilton-Caylay (哈密尔顿-凯莱)定理
  6. 新书推荐:JavaScript征途
  7. 【安卓按键精灵】教你一个小时自己开发脚本,零基础1个小时上手
  8. 消防信号总线原理_消防主机总线原理 什么是消防二总线
  9. ONLYOFFICE 如何连接集成到 Wordpress 上
  10. 不能学习vlan的解决
  11. 进程和线程之面试须知
  12. 关于用户 email 邮件地址是否允许有加号的问题
  13. 计算机cdef盘无法显示,win7计算机不显示硬盘分区盘符
  14. 苹果手机计算机有哪些功能,苹果iPhone手机问答:iPhone计算器原来这么好用 神奇功能汇总...
  15. [OpenGL] 小游戏 - 太空对战
  16. 老破旧ThinkPad机器装Win7
  17. [图文]历届奥斯卡影后(上)
  18. 拦截手机app发起的请求,获取请求信息!调试必备!!!
  19. 大数据分析如何使用pandas进行时间序列分析
  20. Sqoop Flume 数据采集引擎

热门文章

  1. Magnet:即将随 Apache Spark 3.2 发布的高性能外部 Shuffle 服务
  2. BFC是什么?BFC的四种理解方式
  3. vue 所有按钮属性、vue Button 所有按钮属性事件、vue a-button 所有按钮属性事件、vue 按钮所有属性事件、vue
  4. C/C++:无法打开.obj文件
  5. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
  6. [FPGA 日常记录] #4 32个 FPGA 开源网站
  7. WM开发常用资源下载 (转自黎波老师博客)
  8. java文件压缩与解压_Java实现文件压缩与解压
  9. 群晖NAS搭建web服务器,并发布公网可访问 2/4
  10. 网络运维工程师 ,需要掌握知识的总结。