如何手写一个LRU算法

本文探讨了LRU算法在Redis内存淘汰中的应用,解释了LRU的含义,以及为何选择LinkedHashMap作为实现数据结构。通过分析LinkedHashMap的内部机制,展示了如何利用其特性实现LRU缓存,并讨论了removeEldestEntry方法的关键作用。
摘要由CSDN通过智能技术生成

背景

在Redis的内存占用过多的时候,此时会进行内存淘汰,比较常用的就是基于LRU算法进行淘汰。那么什么是LRU算法呢?

LRU算法概念

LRU 是Least Recently Used的缩写,简称最近最少使用。

也就是说在Redis中内存满了,会优先淘汰那些最近最不常访问的数据。那在Java中用什么数据结构去实现呢?一种的话是基于LinkedHashMap,一种是自己设计数据结构,使用链表+HashMap。

既然有现成的,那我们就直接拿过来用吧。有人会问,为什么用LinkedHashMap呢?我们下面看一下LinkedHashMap的数据结构是怎么样的?

LinkedHashMap数据结构

LinkedHashMap继承了HashMap,拥有HashMap的所有特性,同时LinkedHashMap在增加了head和tail指针,用于实现双向链表

/**
 * The head (eldest) of the doubly linked list.
 */
transient LinkedHashMap.Entry<K,V> head;

/**
 * The tail (youngest) of the doubly linked list.
 */
transient LinkedHashMap.Entry<K,V> tail;

LinkedHashMap默认按照插入顺序保存数据,新的数据插入双向链表尾部

public static void main(String[] args) {
   
    LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>();

    linkedHashMap.put("3","3");
    linkedHashMap.put("4","4");
    linkedHashMap.put("1","1");
    linkedHashMap.put("7","7");
    linkedHashMap.put("5","5");
    linkedHashMap.put("9","9");
    linkedHashMap.put("0","0");
    linkedHashMap.put("2","2");
    linkedHashMap.put("6","6");
    linkedHashMap.put("8","8");

    for (Map.Entry<String,String> entry : linkedHashMap.entrySet()){
   
        System.out.println(entry.getKey());
    }

}
=================运行结果=================
3
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值