Redis--缓存淘汰之LRU和LFU

6 篇文章 0 订阅

Redis–缓存淘汰之LRU和LFU

LRU

Least Recently Used 最近最少使用 强调时效性

像是一个链表,元素再次被访问或者刚刚插入链表都会放入头部,当需要淘汰时,则先从尾部开始淘汰。

越靠前面的是越最近被访问的 越靠后面是越久未被访问的

由于LRU算法需要维护一个包含所有元素的链表,且每次数据被访问都要移动元素的位置,如果有大量数据被访问 就会有大量的数据需要在链表内移动

对于redis来说 额外的性能开销太大 redis希望尽可能更少的占用内存 尽可能快

所以redis对LRU进行了优化

Redis在决定淘汰数据时 第一次随机选取N(maxmemory-samples 默认5)个数据进入一个集合 然后对数据的lru字段进行比较,选取最小的进行淘汰(redis内部的RedisObject对象lru字段会记录键值对最近被访问的时间)

当下次再要进行淘汰数据时 再次挑选数据进入这个集合 挑选标准是lru小于集合内lru的最小值 当集合数量达到N个时淘汰最小的

这样极大节省了开销 首先不必维持庞大的链表 其次不去要每次都移动链表元素

缺点是不能精确的保证淘汰最久未被访问的数据

LFU

Least Frequently Used 强调访问次数

即淘汰时优先比较访问次数 访问次数相同比较访问时间

redis以前的版本robj对象的lru字段 24位都是用来记录时间戳

后续改成了 8位用来记录访问次数 16位用来记录访问时间戳

由于8位无符号最大只能表示到255 但是一个键值对被访问次数很容易超过这个值

所以大量被频繁访问的数据 在访问超过255次之后就无法根据访问次数来进行是否会被淘汰的区分了

对此 redis采用了非线性增长的方法 对象被访问一次 不一定会加1 按照随机概率 来决定加不加1

这样被访问次数就不会增加的太快

使用LFU相对于LRU的好处就是

对于一次突然的大规模的键值对扫描 有可能会将一些热点数据淘汰出缓存

而这些大规模的键值对扫描很可能在这次扫描之后就不会再被访问 即形成了缓存污染(占用缓存空间,但是不会再被访问的数据)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值