缓存的淘汰策略-lru

5 篇文章 0 订阅
  • 网站访问速度慢怎么办? 你可能最先想到就是上个缓存,通过缓存减小数据库的访问量

  • 为什么需要淘汰策略?

  • 但是缓存是存在内存中的,这是一笔很大的开销,,当我们的缓存已经到达上限 此时又添加key时,我们就必须得放弃一个或多个key, 但是我们又得保证缓存命中率,保证放弃的key一定是最少被使用的,我们可以使用lru算法作为淘汰机制.

  • lru ( Least Recently Used ) 最近最少使用

  • 如何实现?

  • 第一 、在添加缓存时,我们把访问最少使用的key(链表的头节点)给删除,将新key添加到链表尾部

  • 第二、 访问缓存时,我们把当前key 移到链表尾部

  • 我们可以使用双向链表很方便实现lru

  • 代码


public class LruCache {
    private static final int MaxCap=10;
    private LinkedList<String> lrucache=new LinkedList<String>();

    private static final Map<String,String> kvMap=new ConcurrentHashMap<>();
    public void Push(String key,String val){
        if (lrucache.size()==MaxCap){
            //缓存满了,弹出首个元素,首个元素表示最近最少访问的缓存
            kvMap.remove(lrucache.getFirst());
            lrucache.removeFirst();
        }
        kvMap.put(key,val);

        //加入到尾部
        lrucache.addLast(key);
    }
    public String get(String key){
        if (!kvMap.containsKey(key))
            return null;

        lrucache.remove(key);//先移除

        lrucache.addLast(key);//在重新加入到尾部

        return kvMap.get(key);
    }

    public static void main(String[] args) {
        LruCache lru = new LruCache();

        for (int i=0;i<=20;i++){
            lru.Push(String.valueOf(i),String.valueOf(i));
        }
        System.out.println(lru.get("0")==null);

        System.out.println(lru.get("20")==null);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值