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(最近最少使用)策略 实现 缓存机制的更多相关文章

  1. Mybatis 事务管理和缓存机制

    一级缓存--SqlSession级别 数据库表tb_user User package com.example.demo.domain; public class User { private Int ...

  2. 146. LRU 缓存机制 + 哈希表 + 自定义双向链表

    146. LRU 缓存机制 LeetCode-146 题目描述 题解分析 java代码 package com.walegarrett.interview; /** * @Author WaleGar ...

  3. Java实现 LeetCode 146 LRU缓存机制

    146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  4. 常见面试题之操作系统中的LRU缓存机制实现

    LRU缓存机制,全称Least Recently Used,字面意思就是最近最少使用,是一种缓存淘汰策略.换句话说,LRU机制就是认为最近使用的数据是有用的,很久没用过的数据是无用的,当内存满了就优先 ...

  5. 算法之如何实现LRU缓冲淘汰策略

    1)什么是缓存? 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非广泛的应用,比如常见的CPU缓存.数据库缓存.浏览器缓存等等. 2)为什么使用缓存?即缓存的特点缓存的大小是有限的,当 ...

  6. leetcode LRU缓存机制(list+unordered_map)详细解析

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key) 存 ...

  7. 每天一点点之数据结构与算法 - 应用 - 分别用链表和数组实现LRU缓冲淘汰策略

    一.基本概念: 1.什么是缓存? 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非广泛的应用,比如常见的CPU缓存.数据库缓存.浏览器缓存等等.   2.为什么使用缓存?即缓存的特点缓 ...

  8. Q200510-03-03 :LRU缓存机制

    LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...

  9. Q200510-03-02: LRU缓存机制

    问题: LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果 ...

随机推荐

  1. BootStrap Modal 点击空白时自动关闭

    本文为大家讲解的是如何禁用 BootStrap Modal 点击空白时自动关闭的方法,感兴趣的同学参考下. 方法如下 $('#myModal').modal({backdrop: 'static', ...

  2. Spring注入方式(2)

    3.引用其他bean Bean经常需要相互协作完成应用程序的功能,bean之间必须能够互相访问,就必须在bean配置之间指定对bean的引用,可以通过节点<ref>或者ref来为bean属 ...

  3. Swift中的Weak Strong Dance

    亲爱的博客园的关注着博主文章的朋友们告诉你们一个很不幸的消息哦, 这篇文章将会是博主在博客园发表的最后一篇文章咯, 因为之后的文章博主只会发布到这里哦 http://daiweilai.github. ...

  4. HTML02--引用样式、表格、列表、div布局

    接上一篇“HTML01随笔” 1.使用样式:    内联样式:标签中使用style属性    内部样式:<head>使用<style type="text/css" ...

  5. C# ListView用法详解 很完整

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  6. StarUML使用简明教程

    最近了解到StarUML比较多,所以写一篇教程供大家参考,不足支持,请见谅. StarUML(简称SU),是一种创建UML类图,生成类图和其他类型的统一建模语言(UML)图表的工具.StarUML是一 ...

  7. Mysql备份之Innobakcupex&Xtrabackup

                       一.innobackupex备份工具 基本选项 --compress:该选项表示压缩innodb数据文件的备份. --compress-threads:该选项表示 ...

  8. 2.CentOS6.5下的DNS主从区域传送配置

    接着<1.CentOS6.5下的基础DNS配置>来说,主从区域传送只能让从服务器来进行传送,不给任何人传送,我们看看上一章节<1.CentOS6.5下的基础DNS配置>是否可传 ...

  9. [转] 两个静态html页面传值方法的总结

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/csdn_ds/article/details/78393564 问题 因最近尝试实现客户端与服务端分 ...

  10. win8.1中向IIS注册asp.net

    以前都是用aspnet_regiis -I 命令向IIS注册asp.net ,今天换了win8.1后竟然发现这招不好使了. 根据提示,需要用dism.exe来完成注册. 折腾一会儿后,问题最终解决:  ...