java实现LRU缓存淘汰算法的方法

作者:西凉的悲伤 时间:2022-10-09 00:09:05 

LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多)。

如何实现LRU缓存淘汰算法
场景:

我们现在有这么个真实场景,我在爬取某个网站时,控制该网站的 * 并发数,太多会搞垮对方网站的对吧,要蹲号子的呢。这里我需要维护一个 * 代理池,而且这些IP肯定不是一直都很稳定的,但是又不能取一个就丢一个,这样太浪费资源。所以我会将这些IP缓存起来,进行按需提取,采用LRU最近最少使用的策略去管理 * 。

代码如下:


import java.util.*;

public class LRUCache {

int cap;//最大缓存的数量
   Map<String, String> values;//缓存
   Set<String> position;//缓存的key,按照存入的顺序存储

public LRUCache(int cap) {
       this.cap = cap;
       values = new HashMap<>(cap);
       position = new LinkedHashSet<>(cap);
   }

/**
    * 从缓存中获取值,缓存中没有则返回null
    */
   public String get(String key) {
       String value = null;
       if (values.containsKey(key)) {
           value = values.get(key);
           position.remove(key);
           position.add(key);
       }
       return value;
   }

/**
    * 将值放入缓存中
    */
   public void put(String key, String value) {
       if (position.size() == cap) {
           //若达到缓存上限则将距今最久的缓存删除
           String firstKey = position.iterator().next();
           position.remove(firstKey);
           values.remove(firstKey);
       }
       position.add(key);
       values.put(key, value);
   }

public Map<String, String> getValues() {
       return values;
   }

public Set<String> getPosition() {
       return position;
   }
}

测试:


       LRUCache lruCache = new LRUCache(4);
       lruCache.put("a","a");
       lruCache.put("b","b");
       lruCache.put("c","c");
       lruCache.put("d","d");
       System.out.println("position:"+lruCache.getPosition());
       System.out.println("values:"+lruCache.getValues());

//a将被淘汰
       lruCache.put("e","e");
       System.out.println("position:"+lruCache.getPosition());
       System.out.println("values:"+lruCache.getValues());

输出:

position:[a, b, c, d]
values:{a=a, b=b, c=c, d=d}
position:[b, c, d, e]
values:{b=b, c=c, d=d, e=e}

来源:https://blog.csdn.net/qq_33697094/article/details/121035338

标签:java,LRU,缓存淘汰,算法
0
投稿

猜你喜欢

  • C#算法之各位相加

    2021-09-03 17:32:42
  • Spring Boot2发布调用REST服务实现方法

    2023-12-10 20:03:49
  • RestTemplate请求失败自动重启机制精讲

    2021-09-06 02:03:38
  • SpringCloud之微服务容错的实现

    2023-11-29 02:02:22
  • C语言编程C++动态内存分配示例讲解

    2023-11-02 18:00:12
  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    2023-08-28 03:01:18
  • Java实现简单QQ聊天工具

    2023-11-25 05:54:52
  • Springboot中Aspect切面的实现方式(以记录日志为例)

    2022-09-15 20:58:25
  • Feign如何自定义注解翻译器

    2022-11-09 07:05:04
  • Java多线程 线程组原理及实例详解

    2022-11-26 02:51:40
  • C#表达式中的动态查询详解【译】

    2021-07-29 05:19:42
  • git工作区和暂存区_动力节点Java学院整理

    2022-06-27 20:31:06
  • C#中DataTable和List互转的示例代码

    2022-08-25 21:40:06
  • datatables 带查询条件java服务端分页处理实例

    2023-12-24 08:48:16
  • Android图像处理之霓虹滤镜效果

    2023-08-11 14:37:41
  • Java 并发编程之ThreadLocal详解及实例

    2023-09-05 13:48:02
  • C#微信开发(服务器配置)

    2023-07-18 17:42:01
  • 关于C#泛型列表List<T>的基本用法总结

    2022-10-08 16:43:40
  • 解析如何在android中增加gsensor驱动(MMA7660)

    2023-05-22 22:03:24
  • Eclipse运行android项目报错Unable to build: the file dx.jar was not loaded from the SDK folder的解决办法

    2023-06-14 15:28:30
  • asp之家 软件编程 m.aspxhome.com