最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之理解Redis回收算法LRU案例講解

 更新時間:2021年08月09日 11:03:59   作者:mind_programmonkey  
這篇文章主要介紹了Java之理解Redis回收算法LRU案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

如何通俗易懂的理解LRU算法?

1.LRU是什么?

LRU全稱Least Recently Used,也就是最近最少使用的意思,是一種內存管理算法,最早應用于Linux操作系統(tǒng)。

LRU算法基于一種假設:長期不被使用的數據,在未來被用到的幾率也不大。因此,當數據所占內存達到一定閾值時,我們要移除掉最近最少被使用的數據。

LRU算法應用:可以在內存不夠時,從哈希表移除一部分很少訪問的用戶。

LRU是什么?按照英文的直接原義就是Least Recently Used,最近最久未使用法,它是按照一個非常著名的計算機操作系統(tǒng)基礎理論得來的:最近使用的頁面數據會在未來一段時期內仍然被使用,已經很久沒有使用的頁面很有可能在未來較長的一段時間內仍然不會被使用。基于這個思想,會存在一種緩存淘汰機制,每次從內存中找到最久未使用的數據然后置換出來,從而存入新的數據!它的主要衡量指標是使用的時間,附加指標是使用的次數。在計算機中大量使用了這個機制,它的合理性在于優(yōu)先篩選熱點數據,所謂熱點數據,就是最近最多使用的數據!因為,利用LRU我們可以解決很多實際開發(fā)中的問題,并且很符合業(yè)務場景。

2.LRU的需求

首先考慮這樣的一個業(yè)務場景,小王在A公司上班,有一天產品提出了一個需求:“咱們系統(tǒng)的用戶啊,每天活躍的就那么多,有太多的僵尸用戶,根本不登錄,你能不能考慮做一個篩選機制把這些用戶刨出去,并且給活躍的用戶做一個排名,我們可以設計出一些獎勵活動,提升咱們的用戶粘性,咱們只需要關注那些活躍的用戶就行了“”。小王連忙點頭,說可以啊,然而心里犯起嘀咕來了:這簡單,按照常規(guī)思路,給用戶添加一個最近活躍時間長度和登錄次數,然后按照這兩個數據計算他們的活躍度,最后直接排序就行了。嘿嘿,簡直完美!不過!用戶表字段已經很多了,又要加兩個字段,然后還得遍歷所有的數據排序?這樣查詢效率是不是會受影響???

3.LRU的實現方式

實現 LRUCache 類:

  • LRUCache(int capacity) 以正整數作為容量 capacity 初始化 LRU 緩存;
  • int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值,否則返回 -1 。
  • void put(int key, int value) 如果關鍵字已經存在,則變更其數據值;如果關鍵字不存在,則插入該組「關鍵字-值」。當緩存容量達到上限時,它應該在寫入新數據之前刪除最久未使用的數據值,從而為新的數據值留出空間。

3.1 直接繼承LinkedHashMap來實現

public class Code_LRU {
	class LRUCache extends LinkedHashMap<Integer,Integer>{
		private int capacity;
		public LRUCache(int capacity) {
			super(capacity,0.75F,true);
			this.capacity = capacity;
		}
		
		public int get(int key) {
			return super.getOrDefault(key,-1);
		}
		public void put(int key,int value) {
			super.put(key, value);
		}
		
		// 重寫淘汰策略
		protected boolean removeEldestEntry(Map.Entry<Integer, Integer> edlest) {
			return size()>capacity;
		}
	}
}

3.2 用雙向鏈表+hashMap來實現

// 解題思路:雙向鏈表+hashmap來實現
	class LRUCache_2{
		// 雙向鏈表
		class DLinkedNode{
			int key;
			int value;
			DLinkedNode prev;
			DLinkedNode next;
			public DLinkedNode() {
				
			}
			public DLinkedNode(int key,int value) {
				this.key = key;
				this.value = value;
			}
		}
		
		// hashmap
		private HashMap<Integer,DLinkedNode> cache = new HashMap<>();
		// 定義私有變量
		private int size;
		private int capacity;
		private DLinkedNode head,tail;
		
		public LRUCache_2(int capacity) {
			this.size = 0;
			this.capacity = capacity;
			// 生成偽頭部和偽尾部結點
			head = new DLinkedNode();
			tail = new DLinkedNode();
			head.next = tail;
			tail.prev = head;
		}
		
		//獲得值
		public int get(int key) {
			DLinkedNode node = cache.get(key);
			if(node==null) {
				return -1;
			}else {
				// 如果key存在,哈希表定位 結點移動到頭部
				moveToHead(node);
				return node.value;
			}
		}
		
		// 放入值的操作
		public void put(int key,int value) {
			DLinkedNode node = cache.get(key);
			// 如果key不存在
			if(node==null) {
				// 新創(chuàng)建一個結點
				DLinkedNode newNode = new DLinkedNode(key,value);
				// 添加
				cache.put(key,newNode);
				// 添加到頭部
				addToHead(newNode);
				++size;
				// 判斷容量
				if(size>capacity) {
					// 稱號出容量
					DLinkedNode tail = removeTail();
					// 刪除hash表中對應的項
					cache.remove(tail.key);
					--size;
				}
				
			}else {
				node.value = value;
				// 移動
				moveToHead(node);
			}
		}
		
		// 添加結點的操作
		private void addToHead(DLinkedNode node) {
			node.prev = head;
			node.next = head.next;
			head.next.prev = node;
			head.next = node;
		}
		
		// 刪除結點
		private void removeNode(DLinkedNode node) {
			node.prev.next = node.next;
			node.next.prev = node.prev;
		}
		
		// 移動到頭結點 刪結點 填充結點
		private void moveToHead(DLinkedNode node) {
			removeNode(node);
			addToHead(node);
		}
		// 刪除尾部結點
		private DLinkedNode removeTail() {
			DLinkedNode res = tail.prev;
			removeNode(res);
			return res;
		}
	}

到此這篇關于Java之理解Redis回收算法LRU案例講解的文章就介紹到這了,更多相關Java之理解Redis回收算法LRU內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MAVEN_HOME、M2_HOME,maven環(huán)境變量設置方式

    MAVEN_HOME、M2_HOME,maven環(huán)境變量設置方式

    這篇文章主要介紹了MAVEN_HOME、M2_HOME,maven環(huán)境變量設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java后端用EL表達式改進JSP

    Java后端用EL表達式改進JSP

    EL 全名為Expression Language,EL的語法很簡單,它最大的特點就是使用上很方便,本文帶你用EL表達式改進JSP,感興趣的朋友來看看吧
    2022-02-02
  • 使用React和Java實現文本摘要小工具

    使用React和Java實現文本摘要小工具

    本文將詳細介紹如何使用 React 和 Java 搭建一個小型文本摘要工具,并基于 Hugging Face 提供的 API 來實現智能摘要功能,感興趣的可以了解下
    2024-11-11
  • Java獲取電腦真實IP地址的示例代碼

    Java獲取電腦真實IP地址的示例代碼

    這篇文章主要介紹了Java如何獲取電腦真實IP地址,忽略虛擬機等IP地址的干擾,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • java8 實現map以value值排序操作

    java8 實現map以value值排序操作

    這篇文章主要介紹了java8 實現map以value值排序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Spring集成Swagger常見錯誤及解決辦法

    Spring集成Swagger常見錯誤及解決辦法

    這篇文章主要介紹了Spring集成Swagger常見錯誤及解決辦法,幫助大家更好的理解和學習使用Spring,感興趣的朋友可以了解下
    2021-05-05
  • 詳解SpringBoot中的統(tǒng)一異常處理

    詳解SpringBoot中的統(tǒng)一異常處理

    這篇文章主要介紹了詳解SpringBoot中的統(tǒng)一異常處理,在獨立的某個地方,比如單獨一個類,定義一套對各種異常的處理機制,需要的朋友可以參考下
    2023-05-05
  • Java 如何實現照片轉化為回憶中的照片

    Java 如何實現照片轉化為回憶中的照片

    本文主要介紹了可以對圖片進行色彩處理的Java工具類,讓圖片變成回憶中的畫面,主要將圖片做黑白與褐色的處理。代碼具有一定價值,感興趣的童鞋可以關注一下
    2021-11-11
  • java 關鍵字super詳解及用法

    java 關鍵字super詳解及用法

    這篇文章主要介紹了java 關鍵字super詳解及用法的相關資料,需要的朋友可以參考下
    2017-03-03
  • 簡單實現java音樂播放器

    簡單實現java音樂播放器

    這篇文章主要為大家詳細介紹了java實現音樂播放器的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

乌拉特中旗| 江都市| 乌审旗| 喀什市| 蓬安县| 深水埗区| 湘潭县| 渝中区| 香格里拉县| 娱乐| 襄汾县| 和平区| 嘉义市| 玛曲县| 呼图壁县| 长宁区| 四平市| 岳池县| 来凤县| 锡林浩特市| 昭觉县| 河源市| 新河县| 油尖旺区| 隆子县| 湖南省| 寻甸| 上思县| 哈巴河县| 新丰县| 屏山县| 汽车| 长宁区| 清远市| 乳源| 苏尼特左旗| 屏山县| 大姚县| 清流县| 汉源县| 民乐县|