10-Redis的内存回收

01、过期策略

【1】、定时过期(主动淘汰)

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

【2】、惰性过期(被动淘汰)

只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

【3】、定期过期

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

02、淘汰策略

当内存使用达到最大内存极限时,需要使用淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

【1】、最大内存设置

redis.conf参数配置:

如果不设置maxmemory或者设置为0,64位系统不限制内存,32位系统最多使用3GB内存。 

动态修改:

 

【2】、淘汰策略

修改配置文件redis.conf

#maxmemory-policy noeviction

策略含义
volatile-lru根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够内存为止。如果没有可删除的键对象,回退到noeviction策略
allkeys-lru根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够内存为止。
volatile-lfu在带有过期时间的键中选择最不常用的。
allkeys-lfu在所有的键中选择最不常用的,不管数据有没有设置超时属性。
volatile-random在带有过期时间的键中随机选择。
allkeys-random随机删除所有键,直到腾出足够内存为止。
volatile-ttl根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。
noeviction默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOMcommandnotallowedwhenusedmemory,此时Redis只响应读操作。

 动态修改淘汰策略:

【3】、LRU淘汰原理

LeastRecentlyUsed:最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

1、如果基于传统LRU算法实现RedisLRU会有什么问题?

需要额外的数据结构存储,消耗内存。

2、改良

RedisLRU对传统的LRU算法进行了改良,通过随机采样来调整算法的精度。

如果淘汰策略是LRU,则根据配置的采样值maxmemory_samples(默认是5个),随机从数据库中选择m个key,淘汰其中热度最低的key对应的缓存数据。所以采样参数 m 配置的数值越大,就越能精确的查找到待淘汰的缓存数据,但是也消耗更多的CPU计算,执行效率降低。

3、如何找出热度最低的数据?

Redis中所有对象结构都有一个lru字段,且使用了unsigned的低24位,这个字段用来记录对象的热度。对象被创建时会记录lru值。在被访问的时候也会更新lru的值。但是不是获取系统当前的时间戳,而是设置为全局变量server.lruclock的值。

4、为什么不获取精确的时间而是放在全局变量中?不会有延迟的问题吗?

函数lookupKey中更新数据的lru热度值时,就不用每次调用系统函数time,可以提高执行效率。

当对象里面已经有了LRU字段的值,就可以评估对象的热度了。

评估指定对象的lru热度,思想就是对象的lru值和全局的server.lruclock的差值越大(越久没有得到更新),该对象热度越低。

【4】、LFU

LeastFrequentlyUsed,最不常用,4.0版本新增。

当这24bits用作LFU时,其被分为两部分:

  • 高16位用来记录访问时间(单位为分钟,ldt,lastdecrementtime)
  • 低8位用来记录访问频率,简称counter(logc,logisticcounter)

counter是用基于概率的对数计数器实现的,8位可以表示百万次的访问频率。 

对象被读写的时候,lfu的值会被更新。

增长的速率由,lfu-log-factor越大,counter增长的越慢

redis.conf配置文件

如果计数器只会递增不会递减,也不能体现对象的热度。没有被访问的时候,计数器怎么递减呢?

减少的值由衰减因子lfu-decay-time(分钟)来控制,如果值是1的话,N分钟没有访问就要减少N。

redis.conf配置文件

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值