Redis緩存機制詳解(數據淘汰策略、緩存擊穿、緩存穿透、緩存雪崩)

Redis緩存機制詳解

在這里插入圖片描述

Redis 作為一個高效的內存數據庫,常用于緩存系統。

其緩存機制有助于提高數據訪問速度、減輕后端數據庫壓力。

在這里插入圖片描述

由于 Redis 是基于內存的數據庫,內存資源有限,因此需要有合理的數據淘汰策略以管理內存使用。

1. 內存數據淘汰策略

在 Redis 配置文件中(通常是 redis.conf),可以通過 maxmemory-policy 配置來設定具體的淘汰策略。
在這里插入圖片描述

常見的策略包括:

在這里插入圖片描述

  • volatile-lru: 從設置了過期時間的數據集中,移除最近最少使用的數據。
  • allkeys-lru: 從所有數據集中,移除最近最少使用的數據。
  • volatile-lfu: 從設置了過期時間的數據集中,移除最不常使用的數據。
  • allkeys-lfu: 從所有數據集中,移除最不常使用的數據。
  • volatile-random: 從設置了過期時間的數據集中,隨機移除數據。
  • allkeys-random: 從所有數據集中,隨機移除數據。
  • volatile-ttl: 從設置了過期時間的數據集中,移除即將過期的數據。
  • noeviction: 不移除任何數據,當內存滿時,返回錯誤。該策略通常不建議使用,因為它可能導致無法寫入新數據。
    在這里插入圖片描述

2. 數據過期機制

Redis 支持對鍵設置生存時間(TTL)。當鍵的生存時間到達之后,Redis 會自動刪除該鍵。

  • EXPIRE key seconds: 設置鍵在指定秒數后過期。
  • PEXPIRE key milliseconds: 設置鍵在指定毫秒數后過期。
  • EXPIREAT key timestamp: 設置鍵在指定的時間戳 (單位為秒) 后過期。
  • PEXPIREAT key milliseconds-timestamp: 設置鍵在指定的時間戳 (單位為毫秒) 后過期。

TTL keyPTTL key 命令檢查鍵的剩余生存時間。具體命令細節可查看Redis通用命令詳解。


3. LRU (Least Recently Used) 緩存實現

在這里插入圖片描述

LRU(Least Recently Used,最近最少使用)是一種常見的緩存淘汰策略,用于在緩存空間不足時確定哪些數據應該被移除,以便為新數據騰出空間。

在這里插入圖片描述

傳統的 LRU 算法要求在每次訪問數據時,都更新數據的訪問時間,然后在淘汰時選擇最久未被訪問的數據。

但是Redis 的 LRU 算法并不是嚴格意義上的 LRU 算法,而是近似的 LRU 算法。

在這里插入圖片描述

  • Redis 會定期隨機地從數據集中(默認是每秒鐘從部分數據集中選擇5個鍵),選擇一些鍵檢查是否過期或者需要淘汰。
  • 這種方法相對于每次訪問時都更新訪問時間,大大減少了對每個數據訪問的性能開銷。

盡管 LRU 的實現略有不同,但它的核心思想與一般的 LRU 策略是相似的。

在這里插入圖片描述

配置
  • maxmemory-policy: 在 Redis 配置文件中設置此參數,可以選擇不同的淘汰策略,包括 volatile-lru(對設置了過期時間的數據使用 LRU 策略)、allkeys-lru(對所有數據使用 LRU 策略)等。

  • maxmemory-samples: 這個參數可以設置每次淘汰時從數據集中隨機選擇的鍵的個數,默認是 5。可以根據實際情況調整以影響 LRU 的淘汰效果。
    在這里插入圖片描述


4. LFU (Least Frequently Used) 緩存實現

在這里插入圖片描述
LFU(Least Frequently Used,最不常用),與LRU不同的是,LFU策略基于數據的訪問頻率進行淘汰,而不是最近訪問時間。

  • 高效利用緩存:LFU特別適合那些訪問頻率有明顯差異的數據集,例如一些熱點數據被頻繁訪問,而其他數據較少訪問的場景。
  • 防止緩存污染:LFU可以有效防止緩存被短時間內大量訪問但長期不再使用的數據占據。

和傳統的LFU算法一樣,Redis會優先淘汰那些訪問頻率較低的數據。

LFU策略的核心機制

  1. 訪問頻率計數器

    • 每個鍵都有一個訪問頻率計數器,用于記錄該鍵被訪問的次數。
    • 這個計數器并不是簡單的增加,而是經過某種衰減處理,以防止頻繁訪問的鍵長期占據緩存。
  2. 衰減機制

    • 為了防止計數器無限增長,Redis采用了一種衰減機制,使得訪問頻率會隨著時間的推移而減小。
    • 具體的衰減算法結合了訪問時間和訪問頻率,確保那些歷史上曾經被頻繁訪問但最近很少使用的鍵也會被適當淘汰。
  3. 近似實現

    • 類似于Redis的LRU實現,LFU策略也采用了一種近似方法來減少性能開銷。
    • Redis 并不會在每次訪問時精確地更新所有鍵的訪問頻率,而是通過采樣和概率進行近似估算。
配置
  • maxmemory-policy: 在Redis配置文件中,maxmemory-policy參數可以設置為allkeys-lfuvolatile-lfu:
    • allkeys-lfu: 對所有鍵使用LFU策略。
    • volatile-lfu: 僅對設置了過期時間的鍵使用LFU策略。

在這里插入圖片描述

  • lfu-log-factor: 這個參數控制訪問頻率計數器的衰減速率。默認值是10,表示每次訪問頻率以log(10)的速度增長。值越大,計數器增長越慢,從而更強調近期訪問頻率。

在這里插入圖片描述

  • lfu-decay-time: 這個參數控制頻率計數器的衰減時間。默認值是1小時,表示每小時衰減一次。更短的衰減時間意味著頻率計數器更快地減小,從而使得緩存更容易淘汰那些不再頻繁訪問的鍵。

在這里插入圖片描述

LFU 淘汰過程
  1. 訪問頻率記錄:每次訪問一個鍵時,對應的訪問頻率計數器會根據lfu-log-factor進行更新。
  2. 定期衰減:根據lfu-decay-time,Redis會定期對所有鍵的訪問頻率計數器進行衰減。
  3. 選擇淘汰鍵:當需要淘汰鍵時,Redis會選擇那些訪問頻率最低的鍵進行淘汰。這些鍵的選擇也可能通過隨機采樣來完成,以減少性能開銷。

5. 緩存穿透、緩存擊穿和緩存雪崩

  • 緩存穿透:

    • 通常指緩存和數據庫中都沒有的數據,但大量請求卻涌入,直接打到數據庫上,導致數據庫壓力過大。
    • 用戶請求的數據本身不存在(例如惡意攻擊請求大量不存在的數據)。
    • 每次請求都會繞過緩存直接查詢數據庫,緩存不起作用。

在這里插入圖片描述
常見解決辦法:

  • 緩存空對象
    在這里插入圖片描述

  • 使用布隆過濾器
    在這里插入圖片描述

  • 緩存擊穿:

    • 指的是指緩存中某個熱點數據失效(過期)后,瞬時大量請求直接落到數據庫,導致數據庫壓力驟增的現象。
    • 熱點數據在緩存中存在,并且有許多請求正在訪問該數據。
    • 緩存數據過期了,而這時有大量請求同時到來,所有請求都繞過緩存直接訪問數據庫。

在這里插入圖片描述

常見解決方案:

在這里插入圖片描述
在這里插入圖片描述

  • 緩存雪崩:
    • 指的是緩存服務器(Redis)集群宕機或者大量緩存集中失效,導致大量請求直接打到數據庫上,可能會壓垮數據庫
    • 同一時刻大量緩存數據同時過期。
    • 緩存服務器宕機或重啟,導致緩存不可用。

在這里插入圖片描述

常見解決方案:

在這里插入圖片描述


Tips:了解更多Redis知識,可以去博主的專欄查看哦~

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

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

相關文章

解決chrome瀏覽器總是將對站點的http訪問改為https的問題

問題:vue項目本地運行出來的地址是http開頭的,但在chrome瀏覽器中無法訪問,在Edge瀏覽器就可以,發現是chrome總是自動將http協議升級為https。 已試過的有效的方法: 一、無痕模式下訪問 無痕模式下訪問不會將http自…

Tkinter PyQt或PySide、Kivy 的區別

選擇Python GUI框架時,最好的選擇取決于你的具體需求、項目類型以及你對外觀和用戶體驗的期望。這里是一些常用的Python GUI框架,以及它們的優勢和劣勢: 1. Tkinter 優勢: 內置于Python標準庫中,無需安裝額外的包即可…

java基于ssm+jsp 超市進銷存管理系統

1前臺首頁功能模塊 宜佰豐超市進銷存管理系統,在系統首頁可以查看首頁、商品信息、新聞資訊、留言反饋、我的、跳轉到后臺、購物車等內容,如圖1所示。 圖1前臺首頁功能界面圖 用戶注冊,在用戶注冊頁面可以填寫用戶名、密碼、姓名、聯系電話、…

代碼隨想錄——跳躍游戲(Leecode55)

題目鏈接 貪心 class Solution {public boolean canJump(int[] nums) {int cover 0;if(nums.length 1){return true;}// 只有一個元素可以達到for(int i 0; i < cover; i){// 在cover內選擇跳躍步數cover Math.max(i nums[i],cover);if(cover > nums.length - 1)…

數據庫開發規范

一、引言 數據庫開發規范是確保數據庫系統穩定性、安全性、可維護性和性能的重要指導原則。本規范旨在明確數據庫開發過程中的各項標準&#xff0c;包括命名規范、設計規范、編碼規范、安全規范以及性能優化等方面&#xff0c;以指導開發人員和數據庫管理員進行高效的數據庫開…

出現 defineProps is a compiler macro and no longer needs to be imported. 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 執行前端代碼的時候,出現如下問題: [@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.[@vue/compiler-sfc] defineEmits is a compiler macro and no longer needs to be impo…

【排序 隊列】1585. 檢查字符串是否可以通過排序子字符串得到另一個字符串

本文涉及知識點 排序 隊列 LeetCode1585. 檢查字符串是否可以通過排序子字符串得到另一個字符串 給你兩個字符串 s 和 t &#xff0c;請你通過若干次以下操作將字符串 s 轉化成字符串 t &#xff1a; 選擇 s 中一個 非空 子字符串并將它包含的字符就地 升序 排序。 比方說&a…

Makefile中strip函數的用法

在Makefile中&#xff0c;strip 函數的作用是去除變量值兩端的空白字符&#xff08;空格和制表符&#xff09;。它的基本語法如下&#xff1a; stripped : $(strip variable)其中&#xff0c;variable 是要去除空白字符的變量名或表達式。strip 函數通常用于確保變量的值不包含…

Scikit-learn中的Fit方法:機器學習模型的靈魂

Scikit-learn中的Fit方法&#xff1a;機器學習模型的靈魂 在機器學習的世界里&#xff0c;Scikit-learn&#xff08;簡稱sklearn&#xff09;是一個廣受歡迎的Python庫&#xff0c;以其簡潔、高效而著稱。而在這個庫中&#xff0c;fit方法扮演了一個至關重要的角色。本文將深入…

LLM大語言模型-AI大模型全面介紹

簡介&#xff1a; 大語言模型&#xff08;LLM&#xff09;是深度學習的產物&#xff0c;包含數十億至數萬億參數&#xff0c;通過大規模數據訓練&#xff0c;能處理多種自然語言任務。LLM基于Transformer架構&#xff0c;利用多頭注意力機制處理長距離依賴&#xff0c;經過預訓…

政策護航新能源:政策紅利激發行業活力,助推綠色經濟騰飛

隨著全球氣候變化問題日益嚴重&#xff0c;新能源行業的發展成為推動綠色經濟騰飛的重要引擎。近年來&#xff0c;各國政府紛紛出臺政策支持新能源產業&#xff0c;旨在激發行業活力&#xff0c;促進經濟可持續發展。本文將從政策紅利的角度&#xff0c;探討新能源行業發展的現…

什么是CMSIS || 標準庫與HAL庫

一&#xff0c;ARM&#xff08;Cortex Microcontroller Software Interface Standard&#xff09; ARM Cortex? 微控制器軟件接口標準&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是 CortexM 處理器系列的與供應商無關的硬件抽象層。…

docker的安裝配置及使用

一.Docker的由來 Docker 最初是 dotCloud 公司創始人Solomon Hykes 在法國期間發起的一個公司內部項目。 2010年的專門做PAAS平臺&#xff0c;但是到了2013年的時候&#xff0c;像亞馬遜&#xff0c;微軟&#xff0c;Google都開始做PAAS平臺。 到了2013年&#xff0c;公司資金鏈…

空調器的銅管

1)、 全新開發的空調器&#xff0c;在鈑金、塑料件結構方案設計的同時&#xff0c;進行配管結構設計,充分考慮整體空間的合理分配&#xff0c;以避免配管設計在其它結構方案確定之后&#xff0c;只局限在有限的空間內進行。 2)、 制冷系統以外的結構件已定型的產品&#xff0c…

仿真模擬--靜態浮動路由

目錄 靜態路由 浮動路由 靜態路由 浮動路由

Verilog描述一個帶有異步置位和異步清零的D觸發器

1 帶有異步置位和異步清零的D觸發器的真值表&#xff1a; 2 Verilog代碼描述 module DFF_SR(CLK, D, Rd, Sd, Q, QN);input CLK, D, Rd, Sd;output Q, QN;reg Q_DFF;always (posedge CLKor negedge Rd or negedge Sd)beginif(!Rd)Q_DFF < 1b0;else if(!Sd)Q_DFF < 1b1;e…

使用 C# 和 OpenXML 讀取大型 Excel 文件

介紹 高效讀取大型 Excel 文件可能具有挑戰性&#xff0c;尤其是在處理需要高性能和可擴展性的應用程序時。Microsoft 的 OpenXML SDK 提供了一套強大的工具來處理 Office 文檔&#xff08;包括 Excel 文件&#xff09;&#xff0c;而無需在服務器上安裝 Excel。本文將指導您使…

華為 Mate 70 系列曝光:首發鴻蒙系統,共四款機型

目前華為在 HDC 2024 大會上宣布&#xff0c;HaemonyOS NEXT 開啟開發者先鋒用戶 Beta 測試&#xff0c;根據官方時間表來看&#xff0c;HaemonyOS NEXT 將在 8 月啟動第一批公開 Beta 測試&#xff0c;第四季度推出第一批正式版以及啟動第二批公測。 華為 Mate 70 系列將會與 …

(深度學習記錄)第TR6周:Transformer實戰-單詞預測

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 &#x1f3e1;我的環境&#xff1a; 語言環境&#xff1a;Python3.11.4編譯器&#xff1a;Jupyter Notebooktorcch版本&#xff1a;2.0.…

Keil 5編譯出現misc.c(90): error: no member named ‘IP‘ in ‘NVIC_Type‘

no member named ‘IP’ in ‘NVIC_Type’ 我們在使用Keil 5編譯器的AC6進行代碼編譯的使用&#xff0c;出現如下的錯誤&#xff1b; 當前的環境 編譯器版本 Keil uVision5&#xff0c;V5.31.0.0&#xff1b; CMSIS-Core 版本V6…1.0&#xff1b; 采用GD32F407VK主芯片&…