`

LRU cache的实现

 
阅读更多

最简单的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-2.5.0.zip

    结合这两个压缩包,我们可以推测这可能是一个包含LRU Cache实现的开源项目,同时提供了辅助工具来支持复杂的数据排序,特别是针对存储在缓存中的数据。这样的项目对于开发高效、灵活的数据处理和缓存系统具有很高的...

    最近最少使用cache,提取leveldb的lru cache部分,增加过期时间,过期失效

    在原始的LevelDB实现中,LRU Cache主要关注数据的访问频率,而不涉及数据的过期策略。 在这个项目中,开发者将LevelDB的LRU Cache部分提取出来,作为一个独立的组件,并添加了过期时间的功能。这意味着用户现在可以...

    算法面试通关40讲完整课件 57-58 LRU Cache

    LRU Cache的实现虽然看起来简单,但在面试中回答相关问题时,候选人必须清楚地展示出对数据结构和算法的深入理解。面试官通常会要求候选人现场编写代码,实现LRU Cache的`get`和`put`操作,并且要求这些操作的时间...

    LRU Cache的简单C++实现

     LRU Cache是一个Cache的置换算法,含义是“近少使用”,把满足“近少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是近刚刚访问的,因为这样的数据更有可能被接下来的程序所访问。  LRU的应用比较...

    erlang lru cache module

    Erlang LRU Cache 模块是一个用于实现Least Recently Used(最近最少使用)缓存策略的工具。LRU缓存是一种常见的数据结构,它在内存有限的情况下,通过淘汰最近最少使用的数据来保持缓存的容量。在Erlang中,这个...

    LRU算法实现LRU算法实现LRU算法实现LRU算法实现LRU算法实现

    现在,实现LRU算法的主要逻辑在up_cache函数中,该函数将页面访问序列walk_sort和缓存数组cache作为输入参数。 void up_cache(Cache cache[], int walk_sort[]) { int i = 0; // i 为访问序列数组的下标 int x; ...

    PyPI 官网下载 | backports.functools_lru_cache-1.3.tar.gz

    今天我们将深入探讨其中的一个宝藏库——`backports.functools_lru_cache`,通过分析其1.3版本的源码,来了解这个库如何实现高效的局部最不经常使用(LRU)缓存策略。 `backports.functools_lru_cache`是Python标准...

    LRU更新Cache

    LRU(Least Recently Used)缓存更新策略是一种广泛应用于计算机系统中的内存管理技术,尤其是在操作系统、数据库系统和编程语言的缓存实现中。LRU的基本思想是:当内存空间有限时,最近最少使用的数据应该优先被...

    Python中双向链表的实现及LRU Cache应用详解(包含详细的完整的程序和数据)

    内容概要:本篇文章详细介绍了双向链表的概念、结构及其实现方法,并附带了一个复杂的例子——最少最近使用缓存(LRU Cache)的具体实现实验案例,有助于理解该数据结构的运作方式及应用潜力。 适合人群:适用于对...

    SLRU cache学习指导

    2. 双端队列(deque):了解其特性,并能应用于LRU Cache实现。 3. 哈希表:理解其在数据查找中的高效性。 4. 分段缓存:理解SLRU的两层缓存结构及淘汰策略。 5. 缓存淘汰算法:研究不同场景下的淘汰策略,如LFU...

    LRU-Cache:通过Node.js实现LRU缓存

    Node.js中的LRU缓存实现 用法 const lru = require ( 'LRU-Cache' ) ; 。放 capacity -列表容量,不允许0,默认值:1000 maxAge节点将在maxAge ms内自行销毁 const cache = new lru ( { capacity : 100 } ) ; cache...

    Lru Cache java代码

    LruCache的java代码实现,是从android代码中抽取出来的

    Java实现LRU算法.zip

    HashMap提供快速的查找操作,而LinkedHashMap则同时保持了插入顺序,这对于实现LRU至关重要,因为我们需要快速找到最近最少使用的页面。 首先,我们需要创建一个Page类,它包含页面编号和访问时间等信息。页面编号...

    LRU-cache:用JS实现的LRU缓存

    #LRU缓存通过Node JS中的链接列表和哈希映射实现要运行,请先将存储库克隆到桌面git clone https://github.com/Teaflavored/LRU-cache然后导航到LRU-cache文件夹并运行node testingLRUCache.js

    LRU算法 C++实现

    LRU算法的实现通常依赖于数据结构,如哈希表和双向链表。在C++中,我们可以使用`std::unordered_map`来存储页面及其访问时间,同时使用`std::list`来维护页面的顺序。以下是一个简单的C++实现概述: ```cpp #...

    LRU算法实现1

    ### LRU Cache的`LinkedHashMap`实现 `LinkedHashMap`是Java集合框架中的一个类,继承自`HashMap`,并添加了双向链表的特性。它可以按照插入顺序或访问顺序来维护元素的顺序。当`accessOrder`参数设置为`true`时,`...

    lru-cache-js:使用双链表和映射实现 LRU Cache,读写时间复杂度为 O(1)

    LRU缓存使用的数据结构使用双向链表实现的队列。 队列的最大大小将等于可用帧的总数(缓存大小)。 最近使用的页面将靠近前端,最近最少使用的页面将靠近后端。 以页码为键,以相应队列节点的地址为值的哈希。方法...

    Python实现的一个简单LRU cache

    这里我们将讨论如何使用Python实现一个简单的LRU缓存。 首先,我们要明确LRU缓存的主要特性: 1. **键值对存储**:LRU缓存需要存储键(key)和对应的值(value),通常使用字典(dictionary)来实现键值对的快速...

    lru-cache:C ++中功能完整的LRU缓存实现

    在C++中实现LRU缓存,需要理解数据结构和算法的基础知识,特别是哈希表和双向链表的应用。 在C++中,LRU缓存通常通过结合哈希表(如`std::unordered_map`)和双向链表(如`std::list`或自定义实现)来实现。哈希表...

    东南大学操作系统实验——实现LRU算法及其近似算法

    实验的主要数据结构是一个模板类`lru_cache`,它基于关联容器`std::unordered_map`和双向链表`std::list`实现。`unordered_map`用于快速查找页面,而`list`则保持页面的访问顺序。`put()`方法用于插入或更新页面,`...

Global site tag (gtag.js) - Google Analytics