LRU算法详解

定义

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

应用场景

LRU是一种常见的缓存管理算法,在一些常见的技术中,都有应用,如redis的缓存淘汰策略,mysql的数据缓存页等。

实现方式

通常意义上讲,有两种实现方式,一种是基于访问顺序,一种是基于读取顺序的,接下来基于LinkedHashMap,对这两种实现方式进行Demo编写。

基于访问顺序

  • 实现

public class LocalCache<K, V> {

    private int capacity = 16;

    private LinkedHashMap<K, V> cache;

    public LocalCache(int capacity) {
        this.capacity = capacity;
        cache = new LinkedHashMap<>(capacity);
    }

    public LocalCache() {
        cache = new LinkedHashMap<>(capacity);
    }

    public V get(K key) {
        if (!cache.containsKey(key)) {
            return null;
        }

        V value = cache.get(key);
        cache.remove(key);
        cache.put(key, value);
        return value;
    }

    public void set(K key, V value) {
        if (cache.containsKey(key)) {
            cache.remove(key);
        }

        if (cache.size() == capacity) {
            Set<K> keySet = cache.keySet();
            Iterator<K> iterator = keySet.iterator();
            cache.remove(iterator.next());
        }
        cache.put(key, value);
    }

    @Override
    public String toString() {
        StringBuilder cacheStr = new StringBuilder();
        cache.forEach((k, v) -> cacheStr.append(k).append(":").append(v).append("\t"));
        return cacheStr.toString();
    }
}
  • 测试

public class CacheTest {

    public static void main(String[] args) {
        LocalCache<String, String> localCache = new LocalCache<>(5);
        localCache.set("A", "a");
        localCache.set("B", "b");
        localCache.set("C", "c");
        localCache.set("D", "d");
        localCache.set("E", "e");
        localCache.set("F", "f");
        localCache.get("D");
        System.out.println(localCache);
    }
}
  • 输出

B:b    C:c    E:e    F:f    D:d    

基于存储顺序

  • 实现

public class LocalCache<K, V> extends LinkedHashMap<K, V> {

    private int capacity = 16;

    public LocalCache() {
        super(16);
    }

    public LocalCache(int capacity) {
        super(capacity);
        this.capacity = capacity;
    }

    @Override
    public boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return super.size() > capacity;
    }

    @Override
    public String toString() {
        return super.toString();
    }

}
  • 测试

public class CacheTest {

    public static void main(String[] args) {
        LocalCache<String, String> cache = new LocalCache<>(3);
        cache.put("1", "1");
        cache.put("2", "2");
        cache.put("3", "3");
        cache.put("4", "4");
        System.out.println(cache);
        cache.get("3");
        System.out.println(cache);
    }
}
  • 输出

{2=2, 3=3, 4=4}
{2=2, 3=3, 4=4}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值