【虹科乾貨】Redis 開發者需要瞭解的緩存驅逐策略

来源:https://www.cnblogs.com/hongcloudtech/archive/2023/10/24/17785186.html
-Advertisement-
Play Games

緩存驅逐是指從緩存中刪除特定數據的過程。當緩存達到最大存儲容量時,必須刪除一些數據,為新數據騰出空間。本文將深入探討與緩存驅逐有關的細節,並就如何選擇合適的緩存驅逐策略給出建議。 ...


在你搭建並配置了一個Redis資料庫之後Redis成功地提升了應用程式性能。然而這裡有一個潛在問題,隨著緩存數據的快速增加和記憶體占用率的逐漸上升,很快會發現Redis緩存容量即將達到硬體存儲容量上限。或許你曾聽說過緩存驅逐來解決這個問題,但究竟是怎麼一回事呢?

無論你是在新興企業中擔任開發人員,還是在大型企業中擔任系統管理員,瞭解緩存驅逐策略,並瞭解何時以及如何使用,都至關重要。在本文中,我們將深入探討這些細節,讓你對緩存驅逐有更清晰的認識。

一、對緩存驅逐的理解

Redis或任何依賴緩存的系統中,緩存驅逐策略都至關重要。它是解決緩存空間大小和記憶體占用問題的關鍵。當緩存數據達到硬體容量上限時,緩存系統必須做出決策:是拒絕接收新的數據,還是通過丟棄舊的數據為新數據騰出空間?

此時,緩存驅逐就發揮作用了。為了保持最佳性能和數據一致性,在緩存達到上限時,緩存系統需要進行一系列判斷,以確定應該保留哪些緩存數據,或者需要丟棄哪些緩存數據。

緩存驅逐是指從緩存中刪除特定數據的過程。當緩存達到硬體最大存儲容量時,必須刪除一些數據,為新數據騰出空間。

二、緩存驅逐策略

緩存驅逐策略是一種協議,它解決的問題是當緩存達到上限時,緩存系統需要如何應對。不同的策略對應不同的程式來實現,用於確定應該驅逐(即刪除)哪些舊數據。以下是一些常見的策略。

  • 最近最少使用(Least Recently Used, LRU):想象一下,您正在整理衣櫃,您會優先扔掉哪些物品?是學生時代遺留的格子襯衫,還是近期購入的一頂鴨舌帽?LRU緩存驅逐策略會首先刪除近期被訪問次數最少的緩存數據。其基本假設是不經常被訪問的數據在短期內不會再次被訪問。
  • 最不頻繁使用(Least Frequently Used, LFU):假設你是一名圖書管理員,你將如何選擇要從圖書館書架上移除的書籍?很可能是那些被借閱次數最少的書籍,這也是LFU緩存驅逐策略的思想。LFU策略會優先驅逐最不經常被訪問的緩存數據,其基本假設是近期不再需要這些項目。
  • Window TinyLFU(W-TinyLFU):這個策略稍微複雜一些。想象一下,你是一名電臺DJ,你希望播放那些受歡迎且最近熱門的歌曲。W-TinyLFU緩存驅逐策略根據數據的新舊程度和訪問頻率判斷數據的價值,從而將最有價值的數據保留在緩存中。W-TinyLFU在處理多變的訪問模式和分散式緩存環境時尤為有效。
  • 生存時間(Time to Live, TTL):想象一下,冰箱里有一盒新鮮的聖女果,如果在冰箱里放太久,就會開始變質。此時,不管你有多喜歡它們,都應該將它們扔掉。TTL在緩存中有類似的概念。每個緩存數據都有一個特定的“過期時間”。一旦達到該時間限制,無論訪問頻率或最近訪問次數如何,數據都會被驅逐。這種策略可以確保過時的數據被及時清除。它適用於需要定期更新數據,並確保緩存不提供舊數據的情況。

策略的有效性取決於具體的使用情況,沒有一種策略適用於所有場景。在選擇和使用緩存驅逐策略時,需要仔細考慮應用程式的特定需求和數據訪問模式。

三、採用預設設置的風險

Redis中,預設的驅逐策略是易失性LRU(volatile-LRU)。但僅僅依賴預設策略而不瞭解其潛在影響,就可能存在一定風險。應用程式服務於多樣化的用戶需求,數據模式和數據驅逐要求可能存在巨大差異。通過正確設置驅逐策略可以預防潛在的問題。

1、第一道防線:監控

首先,我們需要監控緩存性能以確認何時需要進行驅逐操作。我們通過監控工具達成這一目的。

Redis中,可以通過INFO命令來監控緩存性能,也可以使用第三方監控工具提供更詳細的性能分析。

優化緩存性能涉及兩個方面,需要根據監控性能時所發現的信息,對緩存設置和緩存驅逐策略進行調整。分散式緩存場景中,監控與調優在確保跨多節點一致、緩存的高效管理時尤為重要。

2、選擇合適的Redis驅逐策略

Redis中,緩存由maxmemory配置指令進行管理,該指令用於設置記憶體限制。而maxmemory-policy配置指令則根據所選擇的緩存驅逐策略來指導Redis進行驅逐決策。這些配置項都存儲在redis.conf配置文件中。

Redis提供了多種驅逐策略,但以下幾種可能是你最關心的策略。

(1) allkeys-lru

Redis的allkeys-lru策略用於刪除最近最少使用的緩存數據,且無論是否設置了過期時間。

  • 這個策略中,Redis會額外記錄每個鍵的最後訪問時間。每次讀取或寫入鍵時,Redis會更新這個信息。
  • Redis達到記憶體限制並且需要驅逐數據時,它會尋找最長時間未被訪問的鍵,也就是"最近最少使用"的鍵。
  • 接著,Redis會刪除這些鍵,為新的數據騰出可用的空間。

allkeys-lru策略適用於Redis資料庫中的所有鍵,無論是否設置了過期時間。與volatile-lru策略不同的是,後者僅適用於設置了過期時間的鍵。

(2) volatile-lru

volatile-lru策略用於刪除設置了過期時間的最近最少使用的緩存數據。這個策略適用於那些需要定期刷新數據的場景。

(3) allkeys-lfu

allkeys-lfu策略會刪除使用頻率最低的鍵。

  • 在這個策略中,Redis會記錄每個鍵的訪問頻率。每次讀取或寫入鍵時,Redis會更新與鍵相關聯的計數器。
  • Redis達到記憶體限制時,它會尋找具有最低訪問頻率的鍵。
  • 然後,Redis會刪除這些鍵,為新的數據騰出可用的空間。

(4) volatile-lfu

allkeys-lfu類似,volatile-lfu策略僅適用於設置了過期時間的鍵。且按訪問頻率評判鍵的價值,當緩存達到上限時,刪除訪問頻率最低的鍵。

(5) volatile-ttl

volatile-ttl策略優先刪除具有最短TTL的鍵。

  • 這個策略中,Redis會記錄每個鍵的TTL,即鍵的生存時間。TTL是一個持續時間,在到期之後,鍵將自動刪除。
  • Redis達到記憶體限制時,它會尋找具有最短TTL的鍵,也就是即將過期的鍵。
  • Redis會刪除這些鍵,為新的數據騰出可用的空間。

(6) noeviction

顧名思義,noeviction策略是當Redis達到記憶體限制並收到寫入命令時,不會驅逐任何鍵,而是返回錯誤。

  • Redis達到記憶體限制並且收到寫入命令時,它會檢查驅逐策略。
  • 如果策略設置為noeviction,則Redis不會驅逐任何鍵,而是向寫入命令返回錯誤。
  • 在這種情況下,應用程式代碼需要確定如何處理該錯誤條件。

 

事實上,以上每種策略都有其優缺點,最適合的策略需要依具體業務需求而定

當處理大量數據時,使用良好結構的緩存,並結合適當的緩存驅逐策略,可以更好地保持緩存的性能。Redis以其豐富的功能成為優秀的緩存解決方案,併為處理大型數據集的應用程式提供了強大的支持。有效的緩存管理不僅能通過緩存命中加快數據檢索,還能減輕緩存未命中的影響,使得Redis成為各種用例中可靠且高效的緩存解決方案。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文件類型和擴展名 文件種類 常規文件 純文本文件(ASCII) 二進位文件(binary) 數據文件(data) 在ls -al顯示屬性為[-] 目錄 在ls -al顯示屬性為[d] 鏈接文件 區塊設備文件:[b] 字元設備文件:[c] 數據介面文件:[s] 數據輸送文件FIFO:[p] 擴展名 L ...
  • 1.編譯過程 1.1 預處理(Pre-Processing) 展開頭文件, 巨集替換(變數巨集、函數巨集)、替換空格等 gcc -E hello.c -o hello.i // -E 預處理選項, -o 重命名 1.2 編譯(Compilation) 逐行檢查程式中出現的語法錯誤,簡單的邏輯錯誤 gcc ...
  • 首先,對於Ai-WB2系列環境的構建官方文檔已經講的非常明白了,這裡不做闡述如下鏈接所示https://blog.csdn.net/Boantong_/article/details/128480919 本人親自測試可行,請嚴格follow官方的steps。 另外需要註意的是,為了避免錯誤,儘量不要 ...
  • 開發板:STM32F407ZGT6; 目標:想使用軟體“串口調試助手” 情況:開發板上的USB_UART口所在器件損壞或者直接沒有; 解決辦法:查看該開發板的原理圖,可得:串口1的RX接TXD,串口1的TX接RXD,那麼按如下步驟操作:1、現在使用USB轉TTL模塊,將串口1的RX接USB轉TTL模 ...
  • @目錄1. 安裝 ocserv (OpenConnect server)2.生成證書1) 創建工作文件夾2) 生成 CA 證書3) 生成本地伺服器證書4) 生成客戶端證書(不生成)3. 配置 ocserv4.創建用戶5.配置系統設置1) 開啟內核轉發2) 配置iptables規則(不需要配置)3) ...
  • 前言 為了出門方便,我萌生出將Ubuntu放在U盤中的想法。我們都在硬碟上安裝Linux,我個人覺得在U盤上安裝和在硬碟上安裝步驟一致,因為U盤也可以分區使用。我的安裝方法為使用Ubuntu官方鏡像中的grub.efi作為引導,然後正常安裝,只是在安裝過程中的硬碟分區選擇U盤即可。 準備工作 安裝引 ...
  • atexit 處理器中再次調用 exit 為什麼能正常運行?atexit 處理器中再次調用 atexit 註冊的函數為什麼能正常被調用?帶著這些疑問來看看 glibc 是用什麼數據結構存儲終止處理器的,另外看看列印這些結構時遇到了哪些問題 ...
  • 1. 如何構建資料庫環境 1.1. 托管MySQL 1.2. VM上構建 1.3. 天下沒有免費的午餐,每一個選擇都伴隨著一系列的權衡 2. 托管MySQL 2.1. 服務商提供了一個可訪問的資料庫設置程式,而不需要用戶深入瞭解MySQL的具體細節 2.2. 使用托管MySQL將缺乏很多的可見性和控 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...