本篇文章小编给大家分享一下Java手动实现Redis的LRU缓存机制代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
第一种实现(使用LinkedHashMap)
public class LRUCache { int capacity; Mapmap; public LRUCache(int capacity){ this.capacity = capacity; map = new LinkedHashMap<>(); } public int get(int key){ //如果没有找到 if (!map.containsKey(key)){ return -1; } //找到了就刷新数据 Integer value = map.remove(key); map.put(key,value); return value; } public void put(int key,int value){ if (map.containsKey(key)){ map.remove(key); map.put(key,value); return; } map.put(key,value); //超出capacity,删除最久没用的即第一个,或者可以复写removeEldestEntry方法 if (map.size() > capacity){ map.remove(map.entrySet().iterator().next().getKey()); } } public static void main(String[] args) { LRUCache lruCache = new LRUCache(10); for (int i = 0; i < 10; i++) { lruCache.map.put(i,i); System.out.println(lruCache.map.size()); } System.out.println(lruCache.map); lruCache.put(10,200); System.out.println(lruCache.map); }
第二种实现(双链表+hashmap)
public class LRUCache { private int capacity; private Mapmap; private ListNode head; private ListNode tail; public LRUCache2(int capacity){ this.capacity = capacity; map = new HashMap<>(); head = new ListNode(-1,-1); tail = new ListNode(-1,-1); head.next = tail; tail.pre = head; } public int get(int key){ if (!map.containsKey(key)){ return -1; } ListNode node = map.get(key); node.pre.next = node.next; node.next.pre = node.pre; return node.val; } public void put(int key,int value){ if (get(key)!=-1){ map.get(key).val = value; return; } ListNode node = new ListNode(key,value); map.put(key,node); moveToTail(node); if (map.size() > capacity){ map.remove(head.next.key); head.next = head.next.next; head.next.pre = head; } } //把节点移动到尾巴 private void moveToTail(ListNode node) { node.pre = tail.pre; tail.pre = node; node.pre.next = node; node.next = tail; } //定义双向链表节点 private class ListNode{ int key; int val; ListNode pre; ListNode next; //初始化双向链表 public ListNode(int key,int val){ this.key = key; this.val = val; pre = null; next = null; } } }
补充
像第一种方式,如果复写removeEldestEntry会更简单,这里简单的展示一下
public class LRUCache extends LinkedHashMap{ private int capacity; @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > capacity; } }
樱花校园模拟器4399中文版
樱花校园模拟器4399中文版,十分奇趣好玩的3d校园冒险模拟
我的暑假秘密回忆繁星新春版
我的暑假秘密回忆繁星新春版是一款少女模拟养成类休闲游戏。这款
樱花校园模拟器国际版
樱花校园模拟器国际版,一个超级自由超级好玩的自由恋爱模拟的游
饥荒海难九游版
饥荒海难九游版,带你去真实的海岛上感受一下什么才是真正的孤岛
盖瑞模组体验版最新版
盖瑞模组体验版是玩法非常丰富多元化的沙盒建造游戏,玩家可以在