当前位置: 首页 > 后端技术 > Java

实现LRU缓存淘汰算法

时间:2023-04-02 00:54:24 Java

缓存是一种提高数据读取性能的技术,广泛应用于硬件设计和软件开发,如常见的CPU缓存、数据库缓存、浏览器缓存等。缓存的大小是有限的。当缓存满了,哪些数据应该清空,哪些数据应该保留?这需要一个缓存淘汰策略来决定。常见的策略有三种:先进先出策略FIFO(FirstInFirstOut),最少使用策略LFU(LeastFrequentlyUsed),最近最少使用策略LRU(LeastRecentlyUsed)。leetcode-266的思路是这样的:我们维护一个有序的单向链表,越靠近链表尾部的节点越早被访问到。当访问一个新的数据时,我们从链表的头部开始依次遍历链表。如果这个数据之前在链表中缓存过,我们遍历得到这个数据对应的结点,从原来的位置删除,然后插入到链表的尾部。如果数据不在缓存链表中,则分为两种情况:如果此时缓存未满,则直接将该节点插入到链表尾部;如果此时缓存已满,链表的头节点将被删除。在链表的头部插入一个新的数据节点。代码如下:publicclassLRUCache{intcapacity;Map地图;publicLRUCache(intcapacity){this.capacity=capacity;map=newLinkedHashMap<>();}/***@Title:get*@Description:从缓存中获取元素*@paramkey:*@returnint*@Author:Ansen*/publicintget(intkey){if(!map.containsKey(key)){返回-1;}//先删除旧位置,再放新位置Integervalue=map.remove(key);map.put(键,值);返回值;}/***@Title:put*@Description:添加元素到缓存中*@paramkey:*@paramvalue:*@returnvoid*@Author:Ansen*/publicvoidput(intkey,intvalue){如果(map.containsKey(key)){map.remove(key);地图。放(键,值);返回;}map.put(key,value);//超出容量,删除最长未使用的,使用迭代器删除第一个if(map.size()>capacity){map.remove(map.entrySet().iterator().next().getKey());}}/***@Description:测试*@paramargs:*@returnvoid*@Author:Ansen*/publicstaticvoidmain(String[]args){LRUCachelruCache=newLRUCache(4);lruCache.put(0,0);lruCache.put(1,1);lruCache.put(2,2);lruCache.put(3,3);lruCache.put(4,4);lruCache.put(5,5);lruCache.put(6,6);inti=lruCache.get(3);System.out.println(lruCache.map);}}输出:{4=4,5=5,6=6,3=3}