Redis--內存回收機制詳解

什么是內存回收機制?

眾所周知Redis之所以性能高是因為數據都存在內存中,內存是很寶貴的,Redis的內存回收機制本質就是處理達到過期時間的key-value,以及當內存到達最大使用值時候觸發的內存淘汰策略。

Redis數據刪除的策略有哪些?

定時過期(主動淘汰):創建一個定時器,當key設置有過期時間,且達到過期時間的時候,由定時器任務立即執行刪除操作。

  • 優點:節約內存,到期就刪除,快速釋放不需要的內存占用。
  • 缺點:cpu壓力很大,無論此時cpu負載多高,均占用cpu資源,會影響redis服務器響應時間和吞吐量。
  • 總結:用處理器性能換存儲空間(時間換空間)。

惰性刪除(被動淘汰):數據到達過期時間,不做處理,等下次訪問該數據時,如果過期就刪除,不返回數據,否則正常返回。

  • 優點:節約cpu性能,發現必須刪除時候才刪除。
  • 缺點:內存壓力大,無效數據長期占用內存空間,存在內存泄漏的風險。
  • 總結:用內存存儲空間換處理器性能。

定時過期(主動淘汰):創建一個定時器,當key設置有過期時間,且達到過期時間的時候,由定時器任務立即執行刪除操作。

  • 優點:節約cpu性能,發現必須刪除時候才刪除。
  • 缺點:不好確定刪除操作執行時長和頻率,執行太頻繁,CPU壓力大,執行間隔太久,和惰性刪除一樣,存在返回錯誤數據的風險,比如某個key已經到了過期時間,但是還沒有執行定期刪除,業務查無的時候會返回該數據,該數據是錯誤數據。
  • 總結:周期性抽查存儲空間,通過調整定時掃描的時間間隔和每次掃描的限定耗時,盡量達到CPU和內存資源平衡效果,一般不推薦使用。

Redis采用的是定時刪除和惰性刪除的機制實現過期鍵的內存回收。

Redis對于設置了過期時間的key的逐出算法有哪些?

  • volatile-lru:對生存周期內最少有使用key進行置換(強調的是距離當前的時間,僅關注數據訪問時間和順序,忽略訪問次數)。
  • volatile-lfu:對生存周期內最少使用次數key進行置換(強調的是時間周期內的使用次數,關注時間區間內數據訪問次數)。
  • volatile-random:對生存周期中的key進行隨機置換。
  • volatile-ttl:挑選將要過期的數據進行淘汰。

Redis對于全庫的key的逐出算法有哪些?

  • allkeys-lru:挑選最近最少使用的數據淘汰(強調的是距離當前的時間,僅關注數據訪問時間和順序,忽略訪問次數)。
  • allkeys-lfu:挑選最近使用次數最少的數據淘汰(強調的是時間周期內的使用次數,關注時間區間內數據訪問次數)。
  • allkeys-random:隨機選擇數據淘汰。
    Redis默認的逐出策略是noeviction,當內存使用達到閾值的時候,所有申請內存的命令會報OOM。

LRU算法和LFU算法:

  • LRU算法:LRU(Least Recently Used)最近最少使用(最長時間不被使用)淘汰算法,LRU算法是淘汰最長時間沒有使用key。
  • LFU算法:LFU(Least Frequently Used)最不經常使用(使用次數最少)淘汰算法,LFU是淘汰一段時間內,使用次數最少的key。

Reidis 碎片及原因?

內存分配器的分配策略決定操作系統無法按需分配,這是因為內存分配器一般是按固定大小來分配內存,而不是完全按照應用程序申請的內存空間大小給程序分配,Redis按照固定的大小將空間分配為例如8字節 16字節 32 字節 等等,Redis這么做的目的是減少分配次數,提高性能,比如客戶端申請一個20字節的空間,Redis會分配一個32字節的空間,如果后面在追加10個字節的數據,Redis就無需再次分配空間了。而Redis內存碎片的產生也是因為這個策略,同樣如客戶端申請一個20字節的空間,Redis會分配一個32字節的空間,后續不在增加數據了,就浪費了12字節的空間,這就是內存碎片。
可以使用 info memory 查詢內存的使用詳細信息,mem_fragmentation_ratio 大于1.5表示內存碎片嚴重,需要處理了。

如何解決Redis的內存碎片問題?

  1. 重啟Redis,數據重建,內存碎片問題會得到大大改善,線上一般不允許這么操作。
  2. 開啟內存碎片自動清理,
 config set activedefrag yes;#表示內存碎片的字節數達到 100MB 時,開始清理;active-defrag-ignore-bytes 100mb;#表示內存碎片空間占操作系統分配給 Redis 的總空間比例達到 10% 時,開始清理active-defrag-threshold-lower 10;

如有不正確的地方請各位指出糾正。

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

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

相關文章

軟考重點題解析-基礎知識

1.加密技術:分為對稱加密技術:文件的加密和解密使用相同的密鑰 和 非對稱加密技術:加密和解密不同的密鑰,分別是公開密鑰和私有密鑰。 例題:若A,B兩人分別在認證機構(CA)M,N處獲得證書&…

項目準備March

Nginx主要用來作為Http服務器,要實現Tomcat的負載均衡,就可以通過Nginx來實現。 正向代理代理的是客戶端,反向代理代理的是服務端。SpringBoot采用約定優于配置的思想,簡化Spring項目的配置開發。 前端請求其實并未直接發送到后…

php連接hdfs初步探索

一、phdfs拓展 結果:暫時舍棄 安裝此拓展時,無法make成功,因為缺少hdfs.n文件。 換了其他版本的拓展包,并編譯都沒有找到此文件。 后搜到官網的相關資料,此hdfs.h的文件路徑的地址是$HADOOP_HDFS_HOME/include/hdfs…

數據增加

目錄 增加數據 實現數據增加,保存新的內容 注意 Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 增加數據 由于 emp 表中的數據對日后的開發依然有用處,所以在講解更新之前 建議將emp 表數據做一個復制。將…

linux如何查看磁盤占用情況

要查看Linux系統中磁盤的占用情況,可以使用一些命令來獲取相關信息。以下是一些常用的命令: df命令: df命令用于顯示文件系統的磁盤空間使用情況,包括磁盤分區的總空間、已用空間、可用空間等信息。 df -h使用 -h 參數可以以人類可…

Golang 簡介與基本語法學習

Go,也被稱為 Golang,是一門由 Google 設計的開源編程語言。它旨在提供高效的開發體驗,同時具備并發性、內存安全和簡潔性。本篇博客將介紹 Golang 的基本語法和一些示例,幫助讀者快速入門這門令人著迷的語言。 簡介 Go 語言的設…

一個腳本兩步計算材料Raman譜(附數據處理和繪圖腳本)

在以往推送中已經介紹了相當多的計算材料Raman的方法,使用的軟件主要為Phonopy-Spectroscopy,相關軟件還有vasp,phonopy,phono3py等。 Phonopy-Spectroscopy計算材料紅外和Raman光譜 Phonopy-Spectroscopy 計算紅外和拉曼光譜 也…

經典面試題從瀏覽器輸入URL到頁面加載的過程?

從輸入URL到頁面加載的過程涉及多個步驟,包括DNS解析、TCP連接、發送HTTP請求、服務器處理請求、瀏覽器解析渲染頁面以及斷開連接。具體如下: DNS解析:當你在瀏覽器中輸入一個URL時,瀏覽器首先需要將域名轉換為IP地址。這個過程稱…

QT中提升為自定義控件的方法

一.介紹 提升為自定義的控件用法:先要寫好自定義控件后,再添加,在頻繁使用同一控件時,的確非常的高效。 同時導入別人開發的控件操作方法也類似。 二.下面以自定義的QPushButton作一個很簡單的例子&#x…

MongoDB聚合運算符:$bottomN

$bottomN聚合運算符返回分組中指定順序的最后n個元素&#xff0c;如果分組中的元素數量小于n&#xff0c;則返回分組的全部元素。從MongoDB5.2開始支持。 語法 {$bottomN:{n: <expression>,sortBy: { <field1>: <sort order>, <field2>: <sort or…

精品SSM的教學管理系統課程作業成績

《[含文檔PPT源碼等]精品基于SSM的教學管理系統[包運行成功]》該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、包運行成功&#xff01; 軟件開發環境及開發工具&#xff1a; Java——涉及技術&#xff1a; 前端使用技術&#xff1a;HTML5,CSS3、Jav…

esp32 C3和S3 開發板電流對比

出去好奇用合宙家的 lot power 測了兩塊開發板的運行電流。 esp32 S3 (嘉立創開發板 8N8 版本) 模式 電流downloa模式49 毫安空代碼91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 無串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …

uniapp npx update-browserslist-db@lates 問題解決

在uniapp運行項目時&#xff0c;會有這種報錯&#xff0c;其實這是表明browserslistlatest版本低了&#xff0c;在催你升級版本&#xff0c;browserslistlatest是用來支持解析css用的&#xff0c;當然&#xff0c;你也可以直接忽略這個報錯提示&#xff0c;也可以正常運行項目。…

探索數據結構:深入了解順序表的奧秘

?? 歡迎大家來到貝蒂大講堂?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;數據結構與算法 貝蒂的主頁&#xff1a;Betty’s blog 1. 什么是順序表 順序表是用一段物理地址連續的存儲單元依次存儲數據元…

【初中生講機器學習】13. 決策樹算法一萬字詳解!一篇帶你看懂!

創建時間&#xff1a;2024-03-02 最后編輯時間&#xff1a;2024-03-02 作者&#xff1a;Geeker_LStar 你好呀~這里是 Geeker_LStar 的人工智能學習專欄&#xff0c;很高興遇見你~ 我是 Geeker_LStar&#xff0c;一名初三學生&#xff0c;熱愛計算機和數學&#xff0c;我們一起加…

取送貨問題(Pickup and Delivery Problem)

取送貨問題及其變體 廣義取送貨問題&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分為兩類&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;從配送中心&#xff08;depot&#xff09;取貨運輸貨物到客…

測試/測試開發八股——找大廠測試實習基礎篇

第一部分:基礎概念 1. 軟件測試是什么? 在規定的條件下對一個產品或者程序進行操作,以發現程序錯誤,衡量軟件質量,并對其是否能滿足設計要求進行評估的過程。 軟件測試工程師的任務 2. 軟件測試工程師的任務 軟件測試工程師主要工作是檢查軟件是否有bug、是否具有穩定…

5.設備驅動程序

5. 設備驅動程序 Linux 內核是一個比較龐大的系統&#xff0c;深入理解內核可以減少在系統移植中的障礙。在系統移植中設備驅動開發是一項很復雜的工作&#xff0c;由于 Linux 內核提供了一部分源代碼&#xff0c;同時還提供了對某些公共部分的支持&#xff0c;例如&#xff0c…

數據結構與算法:堆

朋友們大家好啊&#xff0c;本篇文章來到堆的內容&#xff0c;堆是一種完全二叉樹&#xff0c;再介紹堆之前&#xff0c;我們首先對樹進行講解 樹與堆 1.樹的介紹1.1節點的分類 2.樹的存儲結構3.二叉樹的概念和結構3.1 二叉樹的特點3.2 特殊的二叉樹3.3二叉樹的存儲結構 4.堆的…

Acwing---1460. 我在哪?

我在哪&#xff1f; 1.題目2.基本思想3.代碼實現 1.題目 農夫約翰出門沿著馬路散步&#xff0c;但是他現在發現自己可能迷路了&#xff01; 沿路有一排共 N N N 個農場。 不幸的是農場并沒有編號&#xff0c;這使得約翰難以分辨他在這條路上所處的位置。 然而&#xff0c;…