LRU算法

转载 2016年06月01日 18:14:56

LRU算法

  1. 是什么:LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance.
  2. 实现:
//实现
public class LRUCache1<K, V> {

    private final int MAX_CACHE_SIZE;
    private Entry first;
    private Entry last;

    private HashMap<K, Entry<K, V>> hashMap;

    public LRUCache1(int cacheSize) {
        MAX_CACHE_SIZE = cacheSize;
        hashMap = new HashMap<K, Entry<K, V>>();
    }

    public void put(K key, V value) {
        Entry entry = getEntry(key);
        if (entry == null) {
            if (hashMap.size() >= MAX_CACHE_SIZE) {
                hashMap.remove(last.key);
                removeLast();
            }
            entry = new Entry();
            entry.key = key;
        }
        entry.value = value;
        moveToFirst(entry);
        hashMap.put(key, entry);
    }

    public V get(K key) {
        Entry<K, V> entry = getEntry(key);
        if (entry == null) return null;
        moveToFirst(entry);
        return entry.value;
    }

    public void remove(K key) {
        Entry entry = getEntry(key);
        if (entry != null) {
            if (entry.pre != null) entry.pre.next = entry.next;
            if (entry.next != null) entry.next.pre = entry.pre;
            if (entry == first) first = entry.next;
            if (entry == last) last = entry.pre;
        }
        hashMap.remove(key);
    }

    private void moveToFirst(Entry entry) {
        if (entry == first) return;
        if (entry.pre != null) entry.pre.next = entry.next;
        if (entry.next != null) entry.next.pre = entry.pre;
        if (entry == last) last = last.pre;

        if (first == null || last == null) {
            first = last = entry;
            return;
        }

//这一段没看明白
        entry.next = first;
        first.pre = entry;
        first = entry;
        entry.pre = null;
    }

    private void removeLast() {
        if (last != null) {
            last = last.pre;
            if (last == null) first = null;
            else last.next = null;
        }
    }


    private Entry<K, V> getEntry(K key) {
        return hashMap.get(key);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        Entry entry = first;
        while (entry != null) {
            sb.append(String.format("%s:%s ", entry.key, entry.value));
            entry = entry.next;
        }
        return sb.toString();
    }

    class Entry<K, V> {
        public Entry pre;
        public Entry next;
        public K key;
        public V value;
    }
}
//测试
public class LRUCacheTest {
    public static void main(String[] args)throws Exception{
        System.out.println("start...");

        LRUCacheTest test = new LRUCacheTest();
        test.lruCache1();
    }

    void lruCache1(){
        System.out.println();
        System.out.println("===========================LRU 链表实现===========================");
        LRUCache1<Integer,String> lru = new LRUCache1<Integer, String>(5);
        lru.put(1,"11");
        lru.put(2,"11");
        lru.put(3,"11");
        lru.put(4,"11");
        lru.put(5,"11");
        System.out.println(lru.toString());
        lru.put(6,"66");
        lru.get(2);
        lru.put(7,"77");
        lru.get(4);
        System.out.println(lru.toString());
        System.out.println();
    }
}

LRU算法及例题讲解

概念: LRU(least recently used)是将近期最不会访问的数据给淘汰掉,其实LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低“,...
  • xiao_Mrs_li
  • xiao_Mrs_li
  • 2017年04月05日 15:46
  • 4807

转载:LRU算法

转载来自: LRU页面置换算法模拟    一、设计目的 1、用C语言实现最近最久未使用(LRU)置换算法。 2、了解内存分页管理策略 3、掌握调页策略 4、掌握一般常用的调度算法...
  • huguangshanse00
  • huguangshanse00
  • 2014年08月23日 20:02
  • 5344

Java算法--LRU算法实现示例

原文地址:http://www.cnblogs.com/lzrabbit/p/3734850.html LRU算法,即Last Recently Used ---选择最后一次访问时间距离当前时...
  • tanga842428
  • tanga842428
  • 2016年10月14日 20:21
  • 1102

关于LRU算法

一,LRU 原理 LRU(Least Recently Used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 ...
  • mysteryhaohao
  • mysteryhaohao
  • 2016年04月06日 10:24
  • 2171

最简单的LRU算法java实现

LRU算法用途之广就不说了,凡是要用cache的地方都可以见到它的身影。特别是线程多,并发高,数据量大的环境下。   jdk1.5真好,在LinkedHashMap.java的源码中直接有这...
  • yangxi_001
  • yangxi_001
  • 2013年11月26日 13:11
  • 920

LRU cache 算法的实现

#什么是LRU LRU Cache是一个Cache置换算法,含义是“最近最少使用”,当Cache满(没有空闲的cache块)时,把满足“最近最少使用”的数据从Cache中置换出去,并且保证Cache中...
  • renwotao2009
  • renwotao2009
  • 2016年11月07日 15:16
  • 1147

【Oracle】-【LRU和DBWR】-LRU算法与DBWR中的应用

Oracle体系结构中经常看到LRU算法,Least Recently Used,也有叫“最近最少使用页面置换算法”,简单讲,Oracle会将内存中最近不用的数据库移出内存以腾出空间来加载另外的数据。...
  • bisal
  • bisal
  • 2013年07月21日 12:37
  • 2667

LRU算法的简单JavaScript实现

LRU算法的简单JavaScript实现主要代码如下function LRU() { this.dataStore = []; this.enqueue = enqueue;} fu...
  • qq_25453303
  • qq_25453303
  • 2016年12月07日 16:10
  • 240

LRU算法——python实现

在LeetCode上看到这么一道题,关于LRU算法是原理很简单,
  • u013184096
  • u013184096
  • 2014年08月12日 09:10
  • 1277

Java实现LRU算法

用Java实现最近最少使用算法,代码如下: import java.util.LinkedHashMap; import java.util.Map; /** * LRU (Least Rec...
  • tanga842428
  • tanga842428
  • 2016年08月13日 15:21
  • 634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LRU算法
举报原因:
原因补充:

(最多只允许输入30个字)