Redis之刪除策略

文章目錄

  • 前言
  • 一、過期數據
  • 二、數據刪除策略
    • 2.1定時刪除
    • 2.2惰性刪除
    • 2.3 定期刪除
    • 2.4 刪除策略比對
  • 三、逐出算法
    • 3.1影響數據逐出的相關配置
  • 總結


前言

Redis的常用刪除策略


一、過期數據

Redis是一種內存級數據庫,所有數據均存放在內存中,內存中的數據可以通過TTL指令獲取其狀態

  • XX :具有時效性的數據
  • -1 :永久有效的數據
  • -2 :已經過期的數據或被刪除的數據或未定義的數據

注:過期數據并不是真的被刪除了

二、數據刪除策略

數據刪除策略的目標:在內存占用與CPU占用之間尋找一種平衡,顧此失彼都會造成整體redis性能的下降,甚至引發服務器宕機或內存泄露。
1. 定時刪除
2. 惰性刪除
3. 定期刪除

2.1定時刪除

  • 創建一個定時器,當key設置有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的刪除操作
  • 優點:節約內存,到時就刪除,快速釋放掉不必要的內存占用
  • 缺點:CPU壓力很大,無論CPU此時負載量多高,均占用CPU,會影響redis服務器響應時間和指令吞吐量
  • 總結:用處理器性能換取存儲空間(拿時間換空間)

2.2惰性刪除

  • 數據到達過期時間,不做處理。等下次訪問該數據時
    • 如果未過期,返回數據
    • 發現已過期,刪除,返回不存在
  • 優點:節約CPU性能,發現必須刪除的時候才刪除
  • 缺點:內存壓力很大,出現長期占用內存的數據
  • 總結:用存儲空間換取處理器性能(拿空間換時間)

2.3 定期刪除

我們可以發現定時刪除和惰性刪除方案都走了極端,會舍棄一個空間或者時間,那么有沒有折中的方案呢?有,那就是定期刪除

定期刪除邏輯

  • Redis啟動服務器初始化時,讀取配置server.hz的值,默認為10
  • 每秒鐘執行server.hz次serverCron()中的方法—databasesCron()—activeExpireCycle()
  • activeExpireCycle()對每個expires[]逐一進行檢測,每次執行250ms/server.hz
    對某個expires[
    ]檢測時,隨機挑選W個key檢測
    • 如果key超時,刪除key
    • 如果一輪中刪除的key的數量>W * 25%,循環該過程
    • 如果一輪中刪除的key的數量≤W * 25%,檢查下一個expires[],0-15循環
    • W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP屬性值
  • 參數current_db用于記錄activeExpireCycle() 進入哪個expires[*] 執行
  • 如果activeExpireCycle()執行時間到期,下次從current_db繼續向下執行
    Redis存儲空間圖:
    在這里插入圖片描述

定期刪除:周期性輪詢redis庫中的時效性數據,采用隨機抽取的策略,利用過期數據占比的方式控制刪除頻度

  • 優點1:CPU性能占用設置有峰值,檢測頻度可自定義設置
  • 優點2:內存壓力不是很大,長期占用內存的冷數據會被持續清理
  • 總結:周期性抽查存儲空間 (隨機抽查,重點抽查)

2.4 刪除策略比對

刪除策略優點缺點核心思想
定時刪除節約內存,不占用不分時段占用CPU資源,頻度高拿時間換空間
惰性刪除延時執行,CPU利用率高內存占用嚴重拿空間換時間
定期刪除內存定期隨機清理,每秒花費固定的CPU資源維護內存,不太耗費CPU資源無明顯缺點隨機抽查,重點抽查

三、逐出算法

當新數據進入redis時,如果內存不足怎么辦?

  • Redis使用內存存儲數據,在執行每一個命令前,會調用freeMemoryIfNeeded()方法檢測內存是否充足。如果內存不滿足新加入數據的最低存儲要求,redis要臨時刪除一些數據為當前指令清理存儲
    空間。清理數據的策略稱為逐出算法
    注意:逐出數據的過程不是100%能夠清理出足夠的可使用的內存空間,如果不成功則反復執行。當對所有數據嘗試完畢后,如果不能達到內存清理的要求,將出現錯誤信息拋出異常:(error) OOM command not allowed when used memory >'maxmemory。

3.1影響數據逐出的相關配置

  • maxmemory最大可使用內存:
    占用物理內存的比例,默認值為0,表示不限制,生產環境中根據需求設定,通常設置在50%以上。

  • maxmemory-samples每次選取待刪除數據的個數:
    選取數據時并不會全庫掃描,導致嚴重的性能消耗,降低讀寫性能。因此采用隨機獲取數據的方式作為待檢測刪除數據

  • maxmemory-policy刪除策略:
    檢測易失數據(可能會過期的數據集server.db[i].expires )

    • volatile-lru:挑選最近最少使用的數據淘汰
    • volatile-lfu:挑選最近使用次數最少的數據淘汰
    • volatile-ttl:挑選將要過期的數據淘汰
    • volatile-random:任意選擇數據淘汰

    檢測全庫數據(所有數據集server.db[i].dict )

    • allkeys-lru:挑選最近最少使用的數據淘汰
    • allkeys-lfu:挑選最近使用次數最少的數據淘汰
    • allkeys-random:任意選擇數據淘汰

    放棄數據驅逐

    • no-enviction(驅逐):禁止驅逐數據(redis4.0中默認策略),會引發錯誤OOM(Out OfMemory)達到最大內存后的,對被挑選出來的數據進行刪除的策略

LRU和LFU區別圖解:
在這里插入圖片描述


總結

以上就是Redis的各種刪除策略。

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

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

相關文章

web基礎入門和PHP語言基礎入門 一

web基礎入門和php語言基礎入門 一 WEB簡介與HTTP入門WEB簡介HTTP 簡介HTTP 請求報文:請求方法:請求頭部:(常見的請求頭)HTTP 響應報文:響應狀態碼:Cookie HTML入門學習什么是HTML什么是標記語言…

【深入了解pytorch】PyTorch擴展:如何使用PyTorch的擴展功能

【深入了解pytorch】PyTorch擴展:如何使用PyTorch的擴展功能 PyTorch擴展:展示如何使用PyTorch的擴展功能1. 自定義損失函數2. 自定義數據加載器3. 自定義優化器總結PyTorch擴展:展示如何使用PyTorch的擴展功能 PyTorch作為一個開源的深度學習框架,在研究和應用領域廣受歡…

PHP入門基礎教程 - 專欄導讀

🏆作者簡介,黑夜開發者,全棧領域新星創作者?,CSDN博客專家,阿里云社區專家博主,2023年6月CSDN上海賽道top4。 🏆數年電商行業從業經驗,歷任核心研發工程師,項目技術負責…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-線性模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述:分析代碼線性模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述: 你會得到一個字符串 s (索引從 0 開始),你必須對它執行 k 個替換操作。替換操作以三…

Floyd算法

正如我們所知道的,Floyd算法用于求最短路徑。Floyd算法可以說是Warshall算法的擴展,三個for循環就可以解決問題,所以它的時間復雜度為O(n^3)。 Floyd算法的基本思想如下:從任意節點A到任意節點B的最短路徑不外乎2種可能&#xff…

openGauss學習筆記-42 openGauss 高級數據管理-觸發器

文章目錄 openGauss學習筆記-42 openGauss 高級數據管理-觸發器42.1 語法格式42.2 參數說明42.3 示例 openGauss學習筆記-42 openGauss 高級數據管理-觸發器 觸發器會在指定的數據庫事件發生時自動執行函數。 42.1 語法格式 創建觸發器 CREATE TRIGGER trigger_name { BEFORE…

Swagger-ui在idea中的使用

1.添加依賴 <!--添加swagger2相關概念--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加swagger-ui相關功能--><de…

Linux學習之基本指令一

在學習Linux下的基本指令之前首先大家要知道Linux下一切皆目錄&#xff0c;我們的操作基本上也都是對目錄的操作&#xff0c;這里我們可以聯想我們是如何在windows上是如何操作的&#xff0c;只是形式上不同&#xff0c;類比學習更容易理解。 目錄 01.ls指令 02. pwd命令 0…

SpringBoot登錄、退出、獲取用戶信息的session處理

1、登錄方法&#xff1a;login PostMapping("/user/login")public ResponseVo<User> login(Valid RequestBody UserLoginForm userLoginForm,HttpSession session) {ResponseVo<User> userResponseVo userService.login(userLoginForm.getUsername(), …

sql A表(含有部分B表字段) 向B表插入A表數據

今天遇到一個數據庫插入問題 向表中插入 生產狀態 為 2 的數據 但生產狀態為改為12 的所有數據 查看網上的評論 參考 insert into b (a,b,c) select ‘1’,‘2’,c from a where a1 這樣就可以a,b字段是插入指定某個值,而C字段則用表a的c字段. 最后解決了。忽然想起原來也有這…

實現Python對.json文件內容的讀取和寫入

要實現Python對.json文件內容的讀取和寫入&#xff0c;可以使用json庫。 首先&#xff0c;需要安裝json庫&#xff1a; pip install json 然后&#xff0c;可以編寫以下代碼來實現對.json文件內容的讀取和寫入&#xff1a; import json# 讀取json文件 with open(data.json, …

PS實現多個圖片轉化GIF動畫

PS實現多個圖片轉化為GIF動畫步驟 一、導入圖片素材1.打開PS軟件&#xff0c;點擊 [文件] --- [腳本] ---[將文件載入堆棧]2.選擇圖片3.導入成功 二、打開時間軸1.點擊[窗口]---[時間軸]2.選擇創建幀動畫3.創建幀動畫 三、創建動畫1.復制幀。2.設置幀的內容。3.修改圖片停留的時…

分布式應用:Zabbix監控Tomcat

目錄 一、理論 1.Zabbix監控Tomcat 二、實驗 1.Zabbix監控Tomcat 三、問題 1.獲取軟件包失敗 2.tomcat 配置 JMX remote monitor不生效 3.Zabbix客戶端日志報錯 一、理論 1.Zabbix監控Tomcat &#xff08;1&#xff09;環境 zabbix服務端&#xff1a;192.168.204.214 …

推薦 4 個 yyds 的 GitHub 項目

本期推薦開源項目目錄&#xff1a; 1. 開源的 Markdown 編輯器 2. MetaGPT 3. SuperAGI 4. 一個舒適的筆記平臺 01 開源的 Markdown 編輯器 Cherry 是騰訊開源的 Markdown 編輯器&#xff0c;基于 Javascript具有輕量簡潔、易于擴展等特點&#xff0c; 它可以運行在瀏覽器或服…

UVM學習知識點

這里是引用 include 和 import pkg區別 1.作用 include與C語言中類似&#xff0c;用于在一個文件中插入另一個文件&#xff1b;import用于在一個作用域中引入一個package&#xff08;或其中的內容&#xff09;&#xff0c;使得這些內容在當前作用域中可以不添加其所在的packag…

常用游戲運營指標DAU、LTV及參考范圍

文章目錄 前言運營指標指標范圍參考值留存指標的意義總結 前言 作為游戲人免不了聽到 DAU 、UP值、留存 等名詞&#xff0c;并且有些名詞聽起來還很像&#xff0c;特別是一款上線的游戲&#xff0c;這些游戲運營指標是衡量游戲業務績效和用戶參與度的重要數據&#xff0c;想做…

Tesseract用OpenCV進行文本檢測

我沒有混日子&#xff0c;只是辛苦的時候沒人看到罷了 一、什么是Tesseract Tesseract是一個開源的OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;OCR是一種技術&#xff0c;它可以識別和解析圖像中的文本內容&#xff0c;使計算機能夠理解并處理…

Maven之mirrorof范圍

mirrorOf 是 central 還是 * 的問題 在配置阿里對官方中央倉庫的鏡像服務器時&#xff0c;我們使用到了 <mirror> 元素。 <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共倉庫</name><url>…

vmalert集成釘釘告警

vmalert通過在alert.rules中配置告警規則實現告警&#xff0c;告警規則語法與Prometheus兼容&#xff0c;依賴Alertmanager與prometheus-webhook-dingtalk實現釘釘告警&#xff0c;以下步驟&#xff1a; 1、構建vmalert 從源代碼構建vmalert&#xff1a; git clone https://…

vue computed和watch的區別

conputed 原理 computed計算屬性,依賴一個值的變化而變化且具有緩存作用,computed在vue內部維護了一個dirty屬性,默認為true當取值的時候dirty為true,執行用戶的方法,且將值緩存起來吧dirty設為false再次取值的時候判斷dirty,dirty為false的時候直接從緩存里面取當依賴的數據…