java 自定义 LRU(最近最少使用)策略 实现 缓存机制
1. java提供了一个简单的方式实现LRU: LinkedHashMap
2. 自定义实现
LRU至少需要两个主要操作: 添加(add)和搜索(search)
public class LRUCache {
private Map<String, CacheEntry> map;
private CacheEntry head , tail;
private int maxSize;
public LRUCache(int maxSize){
if(maxSize < 1){
throw new IllegalArgumentException("Cache maxSize has to be at least 1");
}
this.map = new HashMap<String, CacheEntry>();
head = new CacheEntry("head","");
tail = new CacheEntry("tail", "");
head.setNext(tail);
tail.setPrev(head);
this.maxSize = maxSize;
}
public void add(String key, String value){
CacheEntry cacheEntry = map.get(key);
if(cacheEntry == null){
cacheEntry = new CacheEntry(key, value);
if(map.size() == maxSize){
//缓存达到最大数目
//删除最老的条目
CacheEntry deleteEntry = tail.getPrev();
//从map中移除
map.remove(deleteEntry.getKey());
//从队列中移除
remove(deleteEntry);
}
//添加条目到队列
addFront(cacheEntry);
//添加到map
map.put(key, cacheEntry);
}else{
//更新值
cacheEntry.setValue(value);
//访问条目
accessed(cacheEntry);
}
}
public String search(String key){
CacheEntry entry = map.get(key);
if(entry == null){
return null;
}
accessed(entry);
return entry.getValue();
}
//打印缓存内容
public void print(){
CacheEntry entry = head.getNext();
while(entry != tail){
System.out.println("{" + entry.getKey() + ":" + entry.getValue() + "}");
entry = entry.getNext();
}
System.out.println();
}
public void accessed(CacheEntry entry) {
if(entry.getPrev() != head){
remove(entry);
addFront(entry);
}
}
private void addFront(CacheEntry entry) {
//在队列的头部添加条目
CacheEntry nextEntry = head.getNext();
head.setNext(entry);
entry.setPrev(head);
entry.setNext(nextEntry);
if(nextEntry != null){
nextEntry.setPrev(entry);
}
}
private void remove(CacheEntry entry) {
if(entry == head || entry == tail){
return;//错误
}
entry.getPrev().setNext(entry.getNext());
if(entry.getNext() != null){
entry.getNext().setPrev(entry.getPrev());
}
}
}
/**
* Created by admin on 2018/3/30.
*/
public class CacheEntry {
private CacheEntry prev, next;
private String key, value;
CacheEntry(String key, String value){
this.key = key;
this.value = value;
}
public CacheEntry getPrev() {
return prev;
}
public void setPrev(CacheEntry prev) {
this.prev = prev;
}
public CacheEntry getNext() {
return next;
}
public void setNext(CacheEntry next) {
this.next = next;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
java 自定义 LRU(最近最少使用)策略 实现 缓存机制的更多相关文章
- Mybatis 事务管理和缓存机制
一级缓存--SqlSession级别 数据库表tb_user User package com.example.demo.domain; public class User { private Int ...
- 146. LRU 缓存机制 + 哈希表 + 自定义双向链表
146. LRU 缓存机制 LeetCode-146 题目描述 题解分析 java代码 package com.walegarrett.interview; /** * @Author WaleGar ...
- Java实现 LeetCode 146 LRU缓存机制
146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- 常见面试题之操作系统中的LRU缓存机制实现
LRU缓存机制,全称Least Recently Used,字面意思就是最近最少使用,是一种缓存淘汰策略.换句话说,LRU机制就是认为最近使用的数据是有用的,很久没用过的数据是无用的,当内存满了就优先 ...
- 算法之如何实现LRU缓冲淘汰策略
1)什么是缓存? 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非广泛的应用,比如常见的CPU缓存.数据库缓存.浏览器缓存等等. 2)为什么使用缓存?即缓存的特点缓存的大小是有限的,当 ...
- leetcode LRU缓存机制(list+unordered_map)详细解析
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key) 存 ...
- 每天一点点之数据结构与算法 - 应用 - 分别用链表和数组实现LRU缓冲淘汰策略
一.基本概念: 1.什么是缓存? 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非广泛的应用,比如常见的CPU缓存.数据库缓存.浏览器缓存等等. 2.为什么使用缓存?即缓存的特点缓 ...
- Q200510-03-03 :LRU缓存机制
LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...
- Q200510-03-02: LRU缓存机制
问题: LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果 ...
随机推荐
- vue2.0用法技巧汇总
1.class拼接: 2.select下拉截取: <template> <!--vip班支付报名页面--> <div id="payRecordMain&quo ...
- php 下载文件/直接下载数据内容
思路步骤 * 定义参数 * 魔术方法 * 执行下载 * 获取设置属性函数 * 获取设置文件mime 类型 * 获取设置下载文件名 * 设置header * 下载函数 实现代码 class DownFi ...
- 教你制作自己logo专属的图片
说明:以下教程仅适合对图片分辨率要求不高的情况. 第一步:使用Windows自带的画图工具新建一个250像素*250像素的空白图片. 第二步:使用形状中的三角形,按住Shift键,将三角形拖拉至合适的 ...
- 20190415 踩过的VMware那些坑,安装CentOS 7后无法连网
前言 从2018年12月解散粤储软件公司开始,到现在已经失业将近5个月了,还欠下了四五十万的债,最近决心转Java开发,学习Spring Boot,期望尽快摆脱困境.清掉欠的那些钱. 因为Spring ...
- header请求头信息详细介绍
https://www.byvoid.com/zhs/blog/http-keep-alive-header HTTP协议头部与Keep-Alive模式详解 1.什么是Keep-Alive模式? 我们 ...
- mono上部署web程序初体验
早就想体验一下mono,但一直琐事缠身.难得有时间,便在网上一通狂搜mono相关的资料. 如果想使用Apache服务器,只能使用mod_mono的方式,这里有详细的介绍.这种方式有点繁琐,需要安装一大 ...
- Cassandra概念学习系列之Windows里下载且安装配置Cassandra(最新的3.11.1版本)(图文详解)
不多说,直接上干货! 最近我开始在windows环境中使用Cassandra,虽然在Cassandra站点的安装命令非常清楚和精简,我仍然在环境配置上遇到一些问题.所以我想为后来者分享下我的经验. ...
- 【LESS系列】高级特性
前面我已经有一篇文章是写 LESS 的基础语法的. 那么这一次我们来看一下 LESS 的高级特性. 说起高级特性,首先也必须要一提的是模式匹配. 虽然个人觉得模式匹配的实用度其实也是一般般,但在关键时 ...
- Java Servlet 缺点
1.web.xml配置比较多 2.servlet具有容器依赖性(tomcat没有启动,就没有用)
- Java MySQL(SqlHelper)
1.配置文件为: driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/user_info user=root passwor ...
