国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

瀏覽:89日期:2022-09-01 08:59:26

一、什么是 LRU 算法

就是一種緩存淘汰策略。

計(jì)算機(jī)的緩存容量有限,如果緩存滿了就要?jiǎng)h除一些內(nèi)容,給新內(nèi)容騰位置。但問(wèn)題是,刪除哪些內(nèi)容呢?我們肯定希望刪掉哪些沒(méi)什么用的緩存,而把有用的數(shù)據(jù)繼續(xù)留在緩存里,方便之后繼續(xù)使用。

LRU是Least Recently Used的縮寫(xiě),即最近最少使用,是一種常用的頁(yè)面置換算法,選擇最近最久未使用的頁(yè)面予以淘汰。

二、LRU的使用

LRUCache cache = new LRUCache( 2 /* 緩存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 該操作會(huì)使得密鑰 2 作廢

第一步:創(chuàng)建一個(gè)長(zhǎng)度為2的LRUCache

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

第二步:cache.put(1, 1);放入key=1,value=1的數(shù)據(jù)

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

第三步:cache.put(2,2);放入key = 2,value = 2的數(shù)據(jù)(因?yàn)?剛使用,所有把2移動(dòng)到前面)

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

第四步:cache.get(1);獲取key = 1的數(shù)據(jù)(因?yàn)槲覀儎偸褂昧?,所以把1移動(dòng)到前面)

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

第五步:cache.put(3,3);放入key = 3,value = 3的數(shù)據(jù)(因?yàn)?剛放進(jìn),所以放前面,又因?yàn)槿萘恐挥?,需要移除原先的1個(gè)。只因key = 2是最近最少使用的(key = 1剛get()過(guò)),所以移除2。

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

三、LRU的實(shí)現(xiàn)機(jī)制

算法:

LRU 緩存機(jī)制可以通過(guò)哈希表輔以雙向鏈表實(shí)現(xiàn),我們用一個(gè)哈希表和一個(gè)雙向鏈表維護(hù)所有在緩存中的鍵值對(duì)。

1)雙向鏈表按照被使用的順序存儲(chǔ)了這些鍵值對(duì),靠近頭部的鍵值對(duì)是最近使用的,而靠近尾部的鍵值對(duì)是最久未使用的。

2)哈希表即為普通的哈希映射(HashMap),通過(guò)緩存數(shù)據(jù)的鍵映射到其在雙向鏈表中的位置。

一、初始化:

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

二、cache.put(1,1):

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

三、cache.put(2,2):

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

四、cache.get(1):

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

五、cache.put(3,3):

Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法

四、代碼如下

import java.io.*;import java.util.HashMap;public class test { public static void main(String args[]) throws IOException { LRUCache cache = new LRUCache( 2 /* 緩存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 該操作會(huì)使得密鑰 2 作廢 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 該操作會(huì)使得密鑰 1 作廢 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4 }}/** * 設(shè)計(jì)和實(shí)現(xiàn)一個(gè) LRU (最近最少使用) 緩存機(jī)制。它應(yīng)該支持以下操作: 獲取數(shù)據(jù) get 和 寫(xiě)入數(shù)據(jù) put */class LRUCache { private HashMap<Integer,LinkedNode> cache = new HashMap();//方便通過(guò)key快速定位結(jié)點(diǎn) private int size; private int capacity; private LinkedNode head,tail; class LinkedNode{ int key; int value; LinkedNode pre; LinkedNode next; } public LRUCache(int capacity) { this.size = 0; this.capacity = capacity; head = new LinkedNode(); tail = new LinkedNode(); head.next = tail; tail.pre = head; } /** * 移除節(jié)點(diǎn) * @param node */ private void removeNode(LinkedNode node) { LinkedNode preNode = node.pre; LinkedNode nextNode = node.next; preNode.next = nextNode; nextNode.pre = preNode; } /** * 添加節(jié)點(diǎn)到頭部 * @param node */ private void addNode(LinkedNode node) { node.pre = head; node.next = head.next; head.next.pre = node; head.next = node; } /** * 將節(jié)點(diǎn)移動(dòng)到頭部 * @param node */ private void moveToHead(LinkedNode node) { removeNode(node); addNode(node); } /** * 獲取數(shù)據(jù) * @param key * @return */ public int get(int key) { LinkedNode node = cache.get(key); if(node != null) { moveToHead(node); }else{ return -1; } return node.value; } /** * 寫(xiě)入數(shù)據(jù) * @param key * @param value */ public void put(int key, int value) { LinkedNode node = cache.get(key); //存在 if(node != null) { node.value = value;//可能更新數(shù)據(jù) moveToHead(node); } //不存在 else{ LinkedNode newNode = new LinkedNode(); newNode.key = key; newNode.value = value; cache.put(key,newNode);//更新Map addNode(newNode);//添加結(jié)點(diǎn)到頭部 size++;//更新結(jié)點(diǎn)數(shù) if(size > capacity) {//如果結(jié)點(diǎn)數(shù)超過(guò)容量大小LinkedNode tailPre = tail.pre;cache.remove(tailPre.key);//更新MapremoveNode(tailPre);//刪除最后一個(gè)結(jié)點(diǎn)(尾結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn))size--; } } }}

總結(jié):自己實(shí)現(xiàn)的簡(jiǎn)單LRU總歸太簡(jiǎn)單了,要是想完善或者實(shí)現(xiàn)更真實(shí)的LRU,不妨參考一下Redis中的LRU。(◔◡◔)

到此這篇關(guān)于Java實(shí)現(xiàn)簡(jiǎn)單LRU緩存機(jī)制的方法的文章就介紹到這了,更多相關(guān)Java LRU緩存內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 最近手机中文字幕1 | 国产成人综合日韩精品婷婷九月 | 美国的毛片免费的 | 农村寡妇一级毛片免费看视频 | 成人免费视频播放 | 成人18免费网站在线观看 | 久草草视频在线观看免费高清 | 一本色道久久88亚洲综合 | 色网站在线 | 免费一级特黄欧美大片久久网 | 亚洲第一免费 | 亚洲天堂视频一区 | 成人免费观看视频久爱网 | www色午夜| 亚洲性生活视频 | www.av视频在线观看 | 亚洲国产韩国一区二区 | 亚洲一区欧洲一区 | 男人久久天堂 | 亚洲在线网址 | 国产亚洲精品久久久久久久网站 | 一本色道久久综合亚洲精品 | 国产一级视频在线 | 99视频国产在线 | 久久精品成人免费看 | 超级碰碰碰在线观看 | 国内精品视频九九九九 | 中文字幕免费视频 | 亚洲精品欧洲久久婷婷99 | 另类一区二区三区 | 日韩区在线| 国产精品99久久久久久小说 | 成人在线观看国产 | 在线视频99 | 美女张开腿让人捅 | 成人精品国产亚洲 | 国产在线精品一区二区三区不卡 | 成年人网站在线观看视频 | 色精品视频 | 精品国产一区二区三区不卡蜜臂 | 日本精品高清一区二区2021 |