背景
在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