3种缓存算法,一口气把面试官喂饱

本文介绍了计算机缓存系统中的三种重要算法:FIFO(先进先出)、LRU(最近最少使用)和LFU(最近最不常用)。详细讨论了它们的操作、设计思路,并特别强调了在设计时考虑数据过期处理的重要性。同时,文章提供了简单的非并发环境下的算法设计示例,并提及这些缓存算法在实际应用如JVM堆内缓存中的作用。
摘要由CSDN通过智能技术生成

要说计算机系统里,什么技术把tradeoff体现的淋漓尽致,那肯定是缓存无疑。为了协调高速部件和低速部件的速度差异,加入一个中间缓存层,是解决这种冲突最有效的方案。

其中,JVM堆内缓存是缓存体系中重要的一环,最常用的有FIFO/LRU/LFU三种算法。

  1. FIFO是简单的队列,先进先出。
  2. LRU是最近最少使用,优先移除最久未使用的数据。是时间维度
  3. LFU是最近最不常用,优先移除访问次数最少的数据。是统计维度

由于过期也是缓存的一个重要特点。所有在设计这三种缓存算法时,需要额外的存储空间去存储这个过期时间。

以下将讨论这三种缓存算法的操作和设计要点,但暂未考虑高并发环境

FIFO

先进先出,如果缓存容量满,则优先移出最早加入缓存的数据;其内部可以使用队列实现。

操作

  • Object get(key) :获取保存的数据,如果数据不存在或者已经过期,则返回null。
  • void put(key,value,expireTime):加入缓存。 无论此key是否已存在,均作为新key处理(移除旧key);如果空间不足,则移除已过期的key,如果没有,则移除最早加入缓存的key。过期时间未指定,则表示永不自动过期。
  • 注意 ,我们允许key是有过期时间的,这一点与普通的FIFO有所区别,所以在设计此题时需要注意。(也是面试考察点,偏设计而非算法)

普通的FIFO或许大家都能很简单的写出,增加了过期时间的考虑之后,在设计时需要多考虑。如下示例,为暂未考虑并发环境的FIFO设计。

设计思路

1)用普通的hashMap保存缓存数据。
2)需要额外的map用来保存key的过期特性,例子中使用了TreeMap,将“剩余存活时间”作为key,利用TreeMap的排序特性。

public class FIFOCache {  
  
    //按照访问时间排序,保存所有key-value  
    private final Map<String,Value> CACHE = new LinkedHashMap<>();  
  
    //过期数据,只保存有过期时间的key  
    //暂不考虑并发,我们认为同一个时间内没有重复的key,如果改造的话,可以将value换成set  
    private final TreeMap<Long, String> EXPIRED = new TreeMap<>();  
  
    private final int capacity;  
  
    public FIFOCache(int capacity) {  
        this.capacity = capacit
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值