Tag: lru

从头开始使用双向链接列表的LRU缓存 – moveToHead(Java)

我已经实现了一个简单的LRU缓存作为从头开始手动编写的双向链表。 缓存中填充了由数字(整数)ID区分的对象Request。 这些请求对象被生成为针对一组N <L个预定义的请求对象的L个随机独立且相同分布的请求的流,并且逐个地(即以串行方式)到达高速缓存。 然后我检查缓存命中或未命中以及当前缓存大小是否已达到最大缓存大小,然后根据具体情况,我执行将请求的项目插入缓存或从请求的项目替换LRU缓存项目。 缓存的其中一个操作如下:当我有缓存命中时,如果请求的项目不在头部,则必须将其移动到那里。 举个例子,假设缓存的最大大小为M = 4,其给定时间的内容如下: 货号:7 | 3 | 4 | 五 缓存位置索引:0 | 1 | 2 | 3(头是0,尾是3) 现在,如果我们有一个项目4的缓存命中,由于这个项目不在缓存的头部,它应该被移动到那里,结果将是: 货号:4 | 7 | 3 | 五 缓存位置索引:0 | 1 | 2 | 3(头是0,尾是3) 但是,当我运行代码时,结果是这样: 货号:4 | 7 | 3 | 4 | 五 缓存位置索引:0 | 1 | 2 | 3 […]

Java中的LRU缓存实现

我已经看到了以下代码,我认为在addElement方法的实现中有一个无用的while循环。 它应该永远不会出现比size + 1更多的元素,因为已经存在写锁定。 那么为什么addElement方法会删除元素,直到它得到这个条件为真 while(concurrentLinkedQueue.size() >=maxSize) 围绕这个的任何指针都会很棒。 这是实施: public class LRUCache { private ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); private ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private Lock readLock = readWriteLock.readLock(); private Lock writeLock = readWriteLock.writeLock(); int maxSize=0; public LRUCache(final int MAX_SIZE){ this.maxSize=MAX_SIZE; } public V getElement(K key){ readLock.lock(); try […]

LinkedHashSet实现LRU

我想删除LinkedHashSet最老的成员,我知道有一个removeEldestEntry方法我必须覆盖( Java doc for removeEldestEntry ),但我想我必须定义initial capacity和load factor ,我不关心和我只想删除最近访问过的元素(这里通过访问我的意思是当它已经在集合中或被读取时被put ) 有没有办法不覆盖removeEldestEntry ?

使用LinkedHashMap实现LRU缓存

我试图使用LinkedHashMap实现LRU缓存。 在LinkedHashMap( http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html )的文档中,它说: 请注意,如果将键重新插入地图,则不会影响插入顺序。 但是当我做下面的提示 public class LRUCache extends LinkedHashMap { private int size; public static void main(String[] args) { LRUCache cache = LRUCache.newInstance(2); cache.put(1, 1); cache.put(2, 2); cache.put(1, 1); cache.put(3, 3); System.out.println(cache); } private LRUCache(int size) { super(size, 0.75f, true); this.size = size; } @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > […]