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