千家信息网

Java中Redis的LRU缓存机制怎么实现

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容介绍了"Java中Redis的LRU缓存机制怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年11月08日Java中Redis的LRU缓存机制怎么实现

本篇内容介绍了"Java中Redis的LRU缓存机制怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

第一种实现(使用LinkedHashMap)

public class LRUCache {    int capacity;    Map map;    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;    }}

"Java中Redis的LRU缓存机制怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0