专项攻克——缓存淘汰、淘汰时机
创始人
2025-05-29 05:18:58

文章目录

  • 一、概念
  • 二、缓存淘汰分类
    • 2.1 先进先出算法(FIFO)
    • 2.2 最少使用频率(LFU)
    • 2.3 最近使用(LRU)
  • 三、缓存淘汰时机
    • 3.1 基于容量的回收
    • 3.2 基于时间的回收
    • 3.3 基于引用的回收

一、概念

不管是本地缓存还是分布式缓存,为了保证系统的高性能和高可用,都是使用内存来存储数据的。随着时间的推移,缓存的数据越来越多,由于成本和内存的限制,当存储的数据超过缓存最大容量时,需要对缓存的数据进行淘汰。常用的缓存淘汰策略有FIFO(先进先出算法)、LFU(Least Frequently Used)、LRU(Least Recently Used)等。

二、缓存淘汰分类

2.1 先进先出算法(FIFO)

FIFO(First in First out),先进先出,核心原则是:如果一个数据最先进入缓存中,则应该最早淘汰掉。

  1. 利用一个双向链表保存数据,
  2. 当来了新的数据之后便添加到链表末尾
  3. 如果Cache存满数据,则把链表头部数据删除,
  4. 然后把新的数据添加到链表末尾。
  5. 在访问数据的时候,如果在Cache中存在该数据的话,则返回对应的value值;
  6. 否则返回-1。如果想提高访问效率,可以利用hashmap来保存每个key在链表中对应的位置,但是淘汰缓存时需要维护hashMap。

2.2 最少使用频率(LFU)

LFU(Least Frequently Used),策略原则:淘汰一定时期内被访问次数最少的页面,以次数作为参考。

  1. 新加入数据插入到队列尾部(因为引用计数为1);
  2. 队列中的数据被访问后,引用计数增加,队列重新排序;
  3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除。
    在这里插入图片描述

2.3 最近使用(LRU)

LRU(Least Recently Used),淘汰策略:淘汰最长时间未被使用的页面,以时间作为参考

  1. 新数据插到链表头部;
  2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
  3. 当链表满的时候,将链表尾部的数据丢弃。
    在这里插入图片描述

三、缓存淘汰时机

不管是磁盘也好,内存也罢,我们的空间都不是无限的。所以,我们必须决定:什么时候某个缓存项就不值得保留了。

Guava Cache提供了三种基本的缓存回收时机:基于容量回收、定时回收、基于引用回收。

3.1 基于容量的回收

CacheBuilder.maximumSize(long):规定缓存项的数目不超过固定值。
淘汰机制:淘汰最近没有使用或总体上很少使用的缓存项。
警告:在缓存项的数目达到限定值之前,缓存就可能进行回收操作,通常来说,这种情况发生在缓存项的数目逼近限定值时。

3.2 基于时间的回收

CacheBuilder提供两种定时回收方法:

  1. expireAfterAccess(long, TimeUnit):缓存项在给定时间内没有被读/写访问,则回收。
    淘汰机制:淘汰最近没有使用或总体上很少使用的缓存项。
  2. expireAfterWrite(long, TimeUnit):缓存项在给定时间内没有被写操作(创建或更新),则回收。即固定时候后回收。
    定时回收在周期性地在写操作中执行,偶尔在读操作中执行。

3.3 基于引用的回收

通过weakKeys和weakValues方法指定Cache只保存对缓存记录key和value的弱引用。这样当没有其他强引用指向key和value时,key和value对象就会被垃圾回收器回收。

  1. CacheBuilder.weakKeys():使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式,使用弱引用键的缓存用==而不是equals比较键。
  2. CacheBuilder.weakValues():使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式,使用弱引用值的缓存用==而不是equals比较值。
  3. CacheBuilder.softValues():使用软引用存储值。软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。考虑到使用软引用的性能影响,我们通常建议使用更有性能预测性的缓存大小限定(见上文,基于容量回收)。使用软引用值的缓存同样用==而不是equals比较值。

相关内容

热门资讯

玩家必看“爱玩益智拼图究竟有没... 亲.爱玩益智拼图这款游戏是可以开挂的,确实是有挂的,通过添加客服【4830828】很多玩家在这款游戏...
今日重大通报“红豆牛牛透视挂辅... 您好:红豆牛牛这款游戏可以开挂,确实是有挂的,需要软件加微信【4194432】,很多玩家在红豆牛牛这...
最新一款.乐游棋牌到底有挂吗.... 最新一款.乐游棋牌到底有挂吗.(必胜开挂神器)亲,乐游棋牌这个游戏其实有挂的,确实是有挂的,需要了解...
最新消息“天天乐游牛牛到底有挂... 亲.天天乐游牛牛这款游戏是可以开挂的,确实是有挂的,通过添加客服【4830828】很多玩家在这款游戏...
科普实测“乐达麻将到底有没有挂... 您好:乐达麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【8700483】,很多玩家在乐达麻将这...