Redis緩存刪除略和內存淘汰策略及LRU

1、Redis內存若在配置文件中未設置,內存會無限制增長,直到超出物理內存,拋出out of memory內存耗盡異常

????????解決方法,調整maxmemory參數,一般設置為物理內存的3/4,并且添加緩存刪除策略

2、Redis對于設置了過期時間的的鍵并不是過期立馬刪除,有三種緩存刪除方案

? ? ? ? 1、定時刪除,定時任務去遍歷所有過期鍵值,會占用cpu和影響性能

? ? ? ? 2、惰性刪除,過期了并不刪,下次用到再刪,會占用memory和內存泄漏

? ? ? ? 3、定期刪除,每過一段時間抽取一部分過期了的鍵刪除,這種需要考慮具體的內存使用情況,配置好合理的定期時間。但依然會內存泄漏,需要兜底方案也就是內存淘汰策略。

3、Redis內存淘汰策略,可使用config set xxx命令或者修改配置文件種memory-policy

? ? ? ? ? ?分為兩類,每類四種

所有key
allkeys-lru對所有key使用lru算法
allkeys-lfu對所有key使用lfu算法
allkeys-random對所有key使用隨機刪除算法
noviction不刪除任何key(默認)
設置了過期時間的key
volatite-lru對設置了過期時間的key使用lru算法
volatite-lfu對設置了過期時間的key使用lfu算法
volatite-random對設置了過期時間的key使用隨機刪除
volatite-ttl刪除過期的key

?4、lru算法-淘汰不經常使用的key,思路每次get或者put時,將數據重新插入,超過內存限制則刪除最前面的數據。

public class LRUCache {private final Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();private int capacity;public LRUCache(int capacity) {this.capacity = capacity;}public int get(int key) {if(!map.containsKey(key)){return -1;}int v = map.get(key);map.remove(key);map.put(key, v);return v;}public void put(int key, int value) {map.remove(key);map.put(key, value);if(map.size() > capacity) {map.remove(map.entrySet().iterator().next().getKey());}System.out.println(map);}public static void main(String[] args) {LRUCache l = new LRUCache(2);l.put(2,1);l.put(1,1);l.put(2,3);l.put(4,1);l.get(1);}
}

5、實際上LinkedHashMap已經幫我們實現了lru算法,可以繼承LinkedHashMap,具體如下

public class LRUCache extends LinkedHashMap {private int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return super.size() > capacity;}public static void main(String[] args) {LRUCache l = new LRUCache(2);l.put(2,1);l.put(1,1);l.put(2,3);l.put(4,1);l.get(1);l.get(2);System.out.println(l);}
}

6、如果不基于LinkedHashMap我們需要自己實現存儲+順序結構,可使用哈希+雙向鏈表實現。可以參考HashMap與AQS底層實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目經理的會議之道:全參與還是精選參與?

引言 在項目管理中&#xff0c;會議是一個常見的工具&#xff0c;用于溝通信息、解決問題、做出決策等。然而&#xff0c;項目經理是否需要參加所有的會議呢&#xff1f;這是一個值得深思的問題。作為項目經理&#xff0c;我們需要權衡會議的重要性和我們的時間管理。我們不能…

【第一階段】kotlin的函數

函數頭 fun main() {getMethod("zhangsan",22) }//kotlin語言默認是public,kotlin更規范&#xff0c;先有輸入&#xff08; getMethod(name:String,age:Int)&#xff09;再有輸出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

Elasticsearch集群shard過多后導致的性能問題分析

1.問題現象 上午上班以后發現ES日志集群狀態不正確&#xff0c;集群頻繁地重新發起選主操作。對外不能正常提供數據查詢服務&#xff0c;相關日志數據入庫也產生較大延時 2.問題原因 相關日志 查看ES集群日志如下&#xff1a; 00:00:51開始集群各個節點與當時的master節點…

Playwright快速上手-1

前言 隨著近年來對UI自動化測試的要求越來越高&#xff0c;,功能強大的測試框架也不斷的涌現。本系列主講的Playwright作為一款新興的端到端測試框架,憑借其獨特優勢,正在逐漸成為測試工程師的熱門選擇。 本系列文章將著重通過示例講解 Playwright python開發環境的搭建 …

Linux Day07

一、僵死進程 1.1僵死進程產生的原因 子進程先于父進程結束, 而父進程沒有獲取子進程退出碼&#xff0c;釋放子進程占用的資源&#xff0c;此時子進程將成為一個僵死進程。 在第一個框這里時父進程子進程都沒有結束&#xff0c;顯示其pid 父進程是2349&#xff0c;子進程是235…

【Nginx】Nginx網站服務

國外主流還是使用apache&#xff1b;國內現在主流是nginx&#xff08;并發能力強&#xff0c;相對穩定&#xff09; nginx&#xff1a;高性能、輕量級的web服務軟件 特點&#xff1a; 1.穩定性高&#xff08;沒apache穩&#xff09;&#xff1b; 2.系統資源消耗比較低&#xf…

Failed to set locale, defaulting to C.UTF-8 或者中文系統語言轉英文系統語言

CentOS 8中執行命令&#xff0c;出現報錯&#xff1a;Failed to set locale, defaulting to C.UTF-8報錯原因&#xff1a; 1、沒有安裝相應的語言包。2、沒有設置正確的語言環境。 解決方法1&#xff1a;安裝語言包 設置語言環境需使用命令 localelocale -a 命令&#xff0c;查…

代碼隨想錄day02

977.有序數組的平方 ● 力扣題目鏈接 ● 給你一個按 非遞減順序 排序的整數數組 nums&#xff0c;返回 每個數字的平方 組成的新數組&#xff0c;要求也按 非遞減順序 排序。 思路 ● 暴力排序&#xff0c;時間復雜度O(n nlogn) ● 使用雙指針&#xff0c;時間復雜度O(n) …

Vue中使用v-bind:class動態綁定多個類名

Vue.js是一個流行的前端框架&#xff0c;它可以幫助開發者構建動態交互的UI界面。在Vue.js開發中&#xff0c;經常需要動態綁定HTML元素的class&#xff08;類名&#xff09;屬性&#xff0c;以改變元素的外觀和行為。本文將介紹采用v-bind:class指令在Vue中如何動態綁定多個類…

【大數據】-- 本地部署 Flink kubernetes operator

目錄 1.說明 1.1 版本 1.2 kubernetes 環境 1.3 參考 2.安裝步驟 2.1 安裝本地 kubernetes 環境

判斷鏈表有環的證明

目錄 1.問題 2.證明 3.代碼實現 1.問題 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用…

TansUNet代碼理解

首先通過論文中所給的圖片了解網絡的整體架構&#xff1a; vit_seg_modeling部分 模塊引入和定義相關量&#xff1a; # codingutf-8 # __future__ 在老版本的Python代碼中兼顧新特性的一種方法 from __future__ import absolute_import from __future__ import division fr…

新基建助推數字經濟,CosmosAI率先布局AI超算租賃新紀元

倫敦, 8月14日 - 在英國倫敦隆重的Raffles OWO舉辦的歐盟數字超算新時代戰略合作簽約儀式&#xff0c;CosmosAI、Infinite Money Fund與Internet Research Lab三方強強聯手&#xff0c;達成了歷史性的合作協議&#xff0c;共同邁向超算租賃新紀元。 ? 這次跨界的合作昭示了全球…

Session基礎

文章目錄 什么是Sessionsession與cookie的區別和聯系Session的存Session的取 什么是Session 服務器為每個用戶瀏覽器創建一個會話對象&#xff08;session對象&#xff09;&#xff0c;一個瀏覽器只能產生一個session當新建一個窗口訪問服務器時&#xff0c;還是原來的那個ses…

VR家裝提升用戶信任度,線上體驗家裝空間感

近些年&#xff0c;VR家裝逐漸被各大裝修公司引入&#xff0c;VR全景裝修的盛行&#xff0c;大大增加了客戶“所見即所得”的沉浸式體驗感&#xff0c;不再是傳統二維平面的看房模式&#xff0c;而是讓客戶通過視覺、聽覺、交互等功能更加真實的體驗家裝后的效果。 對于傳統家裝…

本地Linux 部署 Dashy 并遠程訪問教程

文章目錄 簡介1. 安裝Dashy2. 安裝cpolar3.配置公網訪問地址4. 固定域名訪問 轉載自cpolar極點云文章&#xff1a;本地Linux 部署 Dashy 并遠程訪問 簡介 Dashy 是一個開源的自托管的導航頁配置服務&#xff0c;具有易于使用的可視化編輯器、狀態檢查、小工具和主題等功能。你…

JS如何向數組中添加數組

常見的辦法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…

【git】Fork或者git clone克隆了別人項目,如何保持與原項目同步更新

Fork或者git clone克隆了別人項目&#xff0c;如何保持與原項目同步更新 #mermaid-svg-LC920CR873UxZJC3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LC920CR873UxZJC3 .error-icon{fill:#552222;}#mermaid-svg-…

BUUCTF 還原大師 1

題目描述&#xff1a; 我們得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,問號部分是未知大寫字母&#xff0c;為了確定這個神秘字符串&#xff0c;我們通過了其他途徑獲得了這個字串的32位MD5碼。但是我們獲得它的32位MD5碼也是殘缺不全&#xff0c;E903???4D…

【Vue3】自動引入插件-`unplugin-auto-import`

Vue3自動引入插件-unplugin-auto-import&#xff0c;不必再手動 import 。 自動導入 api 按需為 Vite, Webpack, Rspack, Rollup 和 esbuild 。支持TypeScript。由unplugin驅動。 插件安裝&#xff1a;unplugin-auto-import 配置vite.config.ts&#xff08;配置完后需要重啟…