最简单的LRU cache的实现:
import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LruCache<K, V> extends LinkedHashMap<K, V> {
/**
*
*/
private static final long serialVersionUID = -3923317621052085848L;
private int maxCapacity;
private Lock lock = new ReentrantLock();
public LruCache(int maxCapacity ) {
super(maxCapacity + 1, 1f, true);// make it do not rehash ever,
this.maxCapacity = maxCapacity ;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
return size() > this.maxCapacity;
}
@Override
public V put(K key, V value) {
try {
lock.lock();
return super.put(key, value);
} finally {
lock.unlock();
}
}
@Override
public V get(Object key) {
try {
lock.lock();
return super.get(key);
} finally {
lock.unlock();
}
}
}
ibatis中最LRU cache的实现:
import java.util.concurrent.locks.ReadWriteLock;
public interface Cache {
String getId();
int getSize();
void putObject(Object key, Object value);
Object getObject(Object key);
Object removeObject(Object key);
void clear();
ReadWriteLock getReadWriteLock();
}
import org.apache.ibatis.cache.Cache;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
/**
* Lru (first in, first out) cache decorator
*/
public class LruCache implements Cache {
private final Cache delegate;
private Map keyMap;
private Object eldestKey;
public LruCache(Cache delegate) {
this.delegate = delegate;
setSize(1024);
}
public String getId() {
return delegate.getId();
}
public int getSize() {
return delegate.getSize();
}
public void setSize(final int size) {
keyMap = new LinkedHashMap(size, .75F, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
boolean tooBig = size() > size;
if (tooBig) {
eldestKey = eldest.getKey();
}
return tooBig;
}
};
}
public void putObject(Object key, Object value) {
delegate.putObject(key, value);
cycleKeyList(key);
}
public Object getObject(Object key) {
keyMap.get(key); //touch
return delegate.getObject(key);
}
public Object removeObject(Object key) {
return delegate.removeObject(key);
}
public void clear() {
delegate.clear();
keyMap.clear();
}
public ReadWriteLock getReadWriteLock() {
return delegate.getReadWriteLock();
}
private void cycleKeyList(Object key) {
keyMap.put(key, key);
if (eldestKey != null) {
delegate.removeObject(eldestKey);
eldestKey = null;
}
}
}
上面都是最简单的实现,如果要实现一个比较完善的LRU 数据结构可以这样:
实现一个treemap(根据访问次数和最后一次访问时间排序)的entry 元素包含访问次数和最后一次访问时间字段,每次get操作更新这两个字段,每次put的时候发现size已经超过设置的capacity,则删除访问次数最少和最后一次访问时间最久的那个元素。
分享到:
相关推荐
结合这两个压缩包,我们可以推测这可能是一个包含LRU Cache实现的开源项目,同时提供了辅助工具来支持复杂的数据排序,特别是针对存储在缓存中的数据。这样的项目对于开发高效、灵活的数据处理和缓存系统具有很高的...
在原始的LevelDB实现中,LRU Cache主要关注数据的访问频率,而不涉及数据的过期策略。 在这个项目中,开发者将LevelDB的LRU Cache部分提取出来,作为一个独立的组件,并添加了过期时间的功能。这意味着用户现在可以...
LRU Cache的实现虽然看起来简单,但在面试中回答相关问题时,候选人必须清楚地展示出对数据结构和算法的深入理解。面试官通常会要求候选人现场编写代码,实现LRU Cache的`get`和`put`操作,并且要求这些操作的时间...
LRU Cache是一个Cache的置换算法,含义是“近少使用”,把满足“近少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是近刚刚访问的,因为这样的数据更有可能被接下来的程序所访问。 LRU的应用比较...
Erlang LRU Cache 模块是一个用于实现Least Recently Used(最近最少使用)缓存策略的工具。LRU缓存是一种常见的数据结构,它在内存有限的情况下,通过淘汰最近最少使用的数据来保持缓存的容量。在Erlang中,这个...
现在,实现LRU算法的主要逻辑在up_cache函数中,该函数将页面访问序列walk_sort和缓存数组cache作为输入参数。 void up_cache(Cache cache[], int walk_sort[]) { int i = 0; // i 为访问序列数组的下标 int x; ...
今天我们将深入探讨其中的一个宝藏库——`backports.functools_lru_cache`,通过分析其1.3版本的源码,来了解这个库如何实现高效的局部最不经常使用(LRU)缓存策略。 `backports.functools_lru_cache`是Python标准...
LRU(Least Recently Used)缓存更新策略是一种广泛应用于计算机系统中的内存管理技术,尤其是在操作系统、数据库系统和编程语言的缓存实现中。LRU的基本思想是:当内存空间有限时,最近最少使用的数据应该优先被...
内容概要:本篇文章详细介绍了双向链表的概念、结构及其实现方法,并附带了一个复杂的例子——最少最近使用缓存(LRU Cache)的具体实现实验案例,有助于理解该数据结构的运作方式及应用潜力。 适合人群:适用于对...
2. 双端队列(deque):了解其特性,并能应用于LRU Cache实现。 3. 哈希表:理解其在数据查找中的高效性。 4. 分段缓存:理解SLRU的两层缓存结构及淘汰策略。 5. 缓存淘汰算法:研究不同场景下的淘汰策略,如LFU...
Node.js中的LRU缓存实现 用法 const lru = require ( 'LRU-Cache' ) ; 。放 capacity -列表容量,不允许0,默认值:1000 maxAge节点将在maxAge ms内自行销毁 const cache = new lru ( { capacity : 100 } ) ; cache...
LruCache的java代码实现,是从android代码中抽取出来的
HashMap提供快速的查找操作,而LinkedHashMap则同时保持了插入顺序,这对于实现LRU至关重要,因为我们需要快速找到最近最少使用的页面。 首先,我们需要创建一个Page类,它包含页面编号和访问时间等信息。页面编号...
#LRU缓存通过Node JS中的链接列表和哈希映射实现要运行,请先将存储库克隆到桌面git clone https://github.com/Teaflavored/LRU-cache然后导航到LRU-cache文件夹并运行node testingLRUCache.js
LRU算法的实现通常依赖于数据结构,如哈希表和双向链表。在C++中,我们可以使用`std::unordered_map`来存储页面及其访问时间,同时使用`std::list`来维护页面的顺序。以下是一个简单的C++实现概述: ```cpp #...
### LRU Cache的`LinkedHashMap`实现 `LinkedHashMap`是Java集合框架中的一个类,继承自`HashMap`,并添加了双向链表的特性。它可以按照插入顺序或访问顺序来维护元素的顺序。当`accessOrder`参数设置为`true`时,`...
LRU缓存使用的数据结构使用双向链表实现的队列。 队列的最大大小将等于可用帧的总数(缓存大小)。 最近使用的页面将靠近前端,最近最少使用的页面将靠近后端。 以页码为键,以相应队列节点的地址为值的哈希。方法...
这里我们将讨论如何使用Python实现一个简单的LRU缓存。 首先,我们要明确LRU缓存的主要特性: 1. **键值对存储**:LRU缓存需要存储键(key)和对应的值(value),通常使用字典(dictionary)来实现键值对的快速...
在C++中实现LRU缓存,需要理解数据结构和算法的基础知识,特别是哈希表和双向链表的应用。 在C++中,LRU缓存通常通过结合哈希表(如`std::unordered_map`)和双向链表(如`std::list`或自定义实现)来实现。哈希表...
实验的主要数据结构是一个模板类`lru_cache`,它基于关联容器`std::unordered_map`和双向链表`std::list`实现。`unordered_map`用于快速查找页面,而`list`则保持页面的访问顺序。`put()`方法用于插入或更新页面,`...