LRU

LRU称是Least Recently Used,即最近最久未使用
LRU缓存的思想

  • 固定缓存大小,需要给缓存分配一个固定的大小。
  • 每次读取缓存都会改变缓存的使用时间,将缓存的存在时间重新刷新。
  • 需要在缓存满了后,将最近最久未使用的缓存删除,再添加最新的缓存。
    1:加入新的数据
    2:队列空间满了的时候,尾部的数据会被淘汰掉
    3:如果要访问队列中的数据,该数据会被移动到队列的头部

缺点:频繁地访问,会造成数据被访问到的几率会下降,此外,这种normal模式也叫做LRU-1,即最近使用过1次。

【命中率】
当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。
【复杂度】
实现简单。
【代价】
命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。

Java里面实现LRU缓存通常有两种选择
一种是使用LinkedHashMap,
一种是自己设计数据结构,使用双向链表+HashMap**(一般这种)**

1.LinkedHashMap是一个双向链表,加上hashTable的实现。表现出来与普通HashMap的一个区别就是LinkedHashMap会记录存入其中的数据的顺序,并能按顺取出。

2.双向链表+HashMap实现:
Q1:可以把双向链表换成数组吗:命中时需要移到头部,双向链表更快,时间复杂度更好
Q2:可以删除hashmap吗:get和put的时候需要取key值,用hashmap更好
Q3:缓存污染:批量存取:批量的数据就使用了一次,把经常查询的数据挤走了
经常使用的单个数据被挤走
Q4:解决方法:使用频率和时间复杂度LRU-K(K=2时最佳),MQ2,MQ

LRU-K:缺点需要两个链表,内存占用更多

LRU-k

1:新数据加入
2:淘汰数据(这个地方和LRU尾部淘汰是一个道理)
3:某个数据块被访问次数达到k次,每次都会重新排列缓存队列
4:根据时间进行排列
5:插入第k访问时,淘汰距离这次插入时间最久的数据,即淘汰缓存队列中时间最久的数据块

特点:LRU-K:记录被访问过的数据,记录他们的访问次数,缓存列表基于时间排列,基于时间淘汰数据块;内存消耗会比LRU-1更大

1、算法思想
  LRU-K中的K代表最近使用的次数,因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。
2、工作原理
  相比LRU,LRU-K需要多维护一个队列,用于记录所有缓存数据被访问的历史。只有当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。详细实现如下

(1). 数据第一次被访问,加入到访问历史列表;
  (2). 如果数据在访问历史列表里后没有达到K次访问,则按照一定规则(FIFO,LRU)淘汰;
  (3). 当访问历史队列中的数据访问次数达到K次后,将数据索引从历史队列删除,将数据移到缓存队列中,并缓存此数据,缓存队列重新按照时间排序;
  (4). 缓存数据队列中被再次访问后,重新排序;
  (5). 需要淘汰数据时,淘汰缓存队列中排在末尾的数据,即:淘汰“倒数第K次访问离现在最久”的数据。
  LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。
【命中率】
LRU-K降低了“缓存污染”带来的问题,命中率比LRU要高。
【复杂度】
LRU-K队列是一个优先级队列,算法复杂度和代价比较高。
【代价】
由于LRU-K还需要记录那些被访问过、但还没有放入缓存的对象,因此内存消耗会比LRU要多;当数据量很大的时候,内存消耗会比较可观。
LRU-K需要基于时间进行排序(可以需要淘汰时再排序,也可以即时排序),CPU消耗比LRU要高。

redis中LRU的实现
时钟的概念:clock
配置策略:从过去的key里随机选取几个进行判断
Redis会按LRU算法删除设置了过期时间但还没有过期的key,而对于没有设置过期时间的key,Redis是永远保留的

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值