温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么实现Redis的LRU缓存机制

发布时间:2021-08-13 19:25:42 阅读:226 作者:chen 栏目:云计算
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要介绍“怎么实现Redis的LRU缓存机制”,在日常操作中,相信很多人在怎么实现Redis的LRU缓存机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现Redis的LRU缓存机制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

第一种实现(使用LinkedHashMap)

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

怎么实现Redis的LRU缓存机制

第二种实现(双链表+hashmap)

public class LRUCache {    private int capacity;    private Map<Integer,ListNode>map;    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<Integer,Integer> {    private int capacity;        @Override    protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {        return size() > capacity;    }}

到此,关于“怎么实现Redis的LRU缓存机制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4504531/blog/5003075

AI

开发者交流群×