赞
踩
首先由2种方式:惰性回收和周期回收
惰性删除是什么意思?也就是在查询时候再去删除。比方说:对于一个键值对,我们设置了ttl过期时间对吧,等到ttl到期了,那么实际上这个键值对还是没有被删除的,直到这个键被查询时,才会判断ttl是否过期,如果过期,那么就在内存里删除这个键值对,返回nil给查询结果。
周期删除是什么?字面意思时一定周期就会删除,实际上也确实是这样。
然而周期删除并没有这么简单。周期删除分成2种,有FAST模式和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%,那么就结束。
个人思考:
首先对于为什么会有内存淘汰策略?
我们先说一下为什么过期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直接拿来就用好吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。