redis缓存污染

缓存污染

定义

有些数据访问次数很少,被访问一次后很久都不会再被访问了,但是它们仍然占据了缓存空间,这就是缓存污染

LFU算法

redis采用的是LFU算法,LFU算法采取的策略是,首先根据数据的访问次数来筛选,把访问次数最低的淘汰,如果数据访问次数一样,就比较数据的访问时效性,把距离上一次访问最远的淘汰。

实现上面,仍然和LRU算法一样,采取RedisObject的lru字段来存储数据的时间戳和访问次数

前16位记录时间戳,后8位记录访问次数

问题来了,8位只能记录到255次,这个数据太小了,很容易填满。

redis为了防止这种情况出现,设置了一种非线性增长的方法来增加count次数

那就是,数据每被访问一次,就把它和配置项相乘加一,然后取倒数,得到的值和0到1的随机数比较,如果大于随机数,就加1。

使用了这种计算规则后,我们可以通过设置不同的 lfu_log_factor 配置项,来控制计数器值增加的速度,避免 counter 值很快就到 255 了。

在一些场景下,有些数据在短时间内被大量访问后就不会再被访问了。那么再按照访问次数来筛选的话,这些数据会被留存在缓存中,但不会提升缓存命中率。为此,Redis 在实现 LFU 策略时,还设计了一个 counter 值的衰减机制。

LFU 策略使用衰减因子配置项 lfu_decay_time 来控制访问次数的衰减。LFU 策略会计算当前时间和数据最近一次访问时间的差值,并把这个差值换算成以分钟为单位。然后,LFU 策略再把这个差值除以 lfu_decay_time 值,所得的结果就是数据 counter 要衰减的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值