基于LinkedHashMap的LRU缓存实现(FIFO亦可)
缓存 实现 基于 FIFO LRU LinkedHashMap
2023-09-11 14:15:13 时间
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
* @author wh445306
* @version 1.0
* @Desciption:LRUCache 参考:https://www.cnblogs.com/lzrabbit/p/3734850.html
* @date 2021-01-06 18:06
*/
public class LRUCache <K, V>{
private final int MAX_CACHE_SIZE;
private final float DEFAULT_LOAD_FACTORY = 0.75f;
LinkedHashMap<K, V> map;
public LRUCache(int cacheSize) {
MAX_CACHE_SIZE = cacheSize;
int capacity = (int)Math.ceil(MAX_CACHE_SIZE / DEFAULT_LOAD_FACTORY) + 1;
/*
* HashMap负载因子默认即为0.75,是一个折衷的取值
* 第三个参数设置为true,代表linkedlist按访问顺序排序,可作为LRU缓存
* 第三个参数设置为false,代表按插入顺序排序,可作为FIFO缓存
*/
map = new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > MAX_CACHE_SIZE;
}
};
}
public synchronized void put(K key, V value) {
map.put(key, value);
}
public synchronized V get(K key) {
return map.get(key);
}
public synchronized void remove(K key) {
map.remove(key);
}
public synchronized Set<Map.Entry<K, V>> getAll() {
return map.entrySet();
}
public synchronized int size() {
return map.size();
}
public synchronized void clear() {
map.clear();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Map.Entry<K, V> entry : map.entrySet()) {
sb.append(String.format("%s: %s ", entry.getKey(), entry.getValue()));
}
return sb.toString();
}
//测试
public static void main(String[] args) {
LRUCache<Integer, Integer> lru = new LRUCache<>(5);
lru.put(1, 1);
lru.put(2, 2);
lru.put(3, 3);
System.out.println(lru);
lru.get(1);
System.out.println(lru);
lru.put(4, 4);
lru.put(5, 5);
lru.put(6, 6);
System.out.println(lru);
}
}
效果:
相关文章
- MyBatis 查询结果的缓存
- SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理
- 初遇 Asp.net MVC 数据库依赖缓存那些事儿
- c# .net 程序级 缓存,可设置缓存对象的到期时间,到期后缓存key为空
- 【Vue/js】通过localStorage浏览器实现变量和对象的本地缓存(图文+完整源代码)
- 艺多不压身 -- 常用缓存Cache机制的实现
- python中flask_caching库用法详解(缓存)
- 【FPGA教程案例58】深度学习案例5——基于FPGA的CNN卷积神经网络之图像缓存verilog实现
- Java使用ConcurrentHashMap实现简单的内存式缓存
- android读取大图片并缓存
- 图解Kafka Producer中的消息缓存模型
- 使用ThreadLocal来实现一个本地缓存
- linux 后备缓存
- 协议(实现模块)层对缓存机制的支持。
- Mysql查询缓存Query_cache的功用
- 使AJAX调用尽可能利用缓存特性
- Redis缓存服务搭建及实现数据读写
- RecyclerView与ListView 对比浅析:缓存机制
- 24模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存)
- 使用PostgreSQL_Notify实现多实例缓存同步
- 在业务代码中使用redis实现缓存效果