【Redis】緩存|緩存的更新策略|內存淘汰策略|緩存預熱、緩存穿透、緩存雪崩和緩存擊穿

思維導圖:


Redis最主要的用途,三個方面:

1.存儲數據(內存數據庫)

2.緩存(redis最常用的場景)

3.消息隊列


一、什么是緩存

我們知道對于硬件的訪問速度來說,通常情況下:

CPU寄存器 > 內存 > 硬盤?> 網絡

速度快點設備,可以作為速度慢的設備的緩存??

最常見的就是使用 內存 作為 硬盤 的緩存(redis定位)

同樣硬盤也可作為網絡的緩存,比如瀏覽器的緩存,瀏覽器通過http/https從服務器上(網絡)獲取到數據(html,css,圖片,視頻,音頻...)并進行展示,像圖片這種比較大,又不太改變的數據,就可以保存到瀏覽器本地(瀏覽器所在的主機硬盤上),后續打開這個頁面,就不必重新從網絡獲取上述數據了

🍞二八定律

20%的數據,可以應對80%的請求
因此只需要把這少量的熱點數據緩存起來,就可以應對?多數場景,從?在整體上有明顯的性能提升


二、使用Redis作為緩存

通常是使用redis作為數據庫的緩存(mysql),因為數據庫是非常重要的組件,并且mysql的速度又比較慢,所以可以使用redis作為mysql的緩存

🍞為什么關系型數據庫性能不高?

(1)數據存儲在硬盤上,硬盤IO速度很慢,尤其是隨機訪問

(2)如果查詢不能命中索引,就需要全表變量

(3)對SQL執行會做一系列的解析,校驗,優化工作

(4)如果是復雜查詢,需要進行笛卡爾積操作,效率更低

1和2屬于硬件,3和4屬于軟件,因為mysql等數據庫,效率比較低,所以承擔的并發量有限,一旦請求多了,數據庫壓力就很大,甚至就容易宕機了(服務器每次處理應一個請求,一定都要消耗一些硬件資源CPU,內存,硬盤這些,任意一種資源的消耗超出了機器能提供的上限,機器就很容易出現故障

如何提高mysql能承擔的并發量?

(1)開源:引入更多的機器,構成數據庫集群

(2)節流:引入緩存,把一些頻繁讀取的熱點數據,保存到緩存上,后續在查詢數據的時候,如果緩存中已經存在,就不用訪問mysql了


三、📚緩存的更新策略

引入:如何知道redis中應該存哪些數據呢/如何知道哪些數據是熱點數據呢

📚緩存的更新策略:

1.定期生成

怎么做:把訪問的數據,以日志的形式記錄下來,此處的數據,就可以根據當前這里統計的維度,來定期更新(比如按照天級別統計,就每天更新一次),寫一套離線的流程(往往使用shell,python寫腳本),可以通過定時任務來觸發

eg:搜索引擎為例子

a)完成統計熱詞的過程

b)根據熱詞,找到搜索結果的數據(廣告數據)

c)把得到的緩存數據同步到緩存服務器上

d)控制這些緩存服務器自動重啟

優點:可控(緩存中有啥比較固定),方便排查問題

缺點:實時性不夠,如果出現突發熱點事件(比如:”春節晚會“這幾天才會搜索),有一些本來不是熱詞的內容,變為了熱詞,新的熱詞就可能給后面的數據庫帶來較大的壓力

2.實時生成

怎么做:

(1)如果在Redis查到了,就直接返回

(2)如果Redis中不存在,就數據庫中查,把查到的結果同時也寫入redis

存在的問題:經過一段時間的動態平衡,redis中的key就逐漸都成了熱點數據,這樣不同的寫redis,就會使redis的內存占用越來越多,逐漸達到內存上限(這個上限可以配置的maxmemory參數設定),此時如果繼續往里面插入數據,就會觸發問題

解決:

📚內存淘汰策略

(1)FIFO(First In First Out)先進先出:把緩存中存在時間最久的(也就是先來的數據)淘汰掉

(2)LRU(Least Recently Used)淘汰最久未使用的:記錄每個key都最近訪問時間,把最近訪問時間最老的key淘汰掉

(3)LFU(Least Frequently Used)淘汰訪問次數最少的:記錄每個key最近一段時間的訪問次數,把訪問次數最少的淘汰掉

(4)Random 隨機淘汰:從所有的 key 中抽取幸運?被隨機淘汰掉

redis中有個配置,就可以設置redis采取上述哪種策略淘汰內存數據,具體采用哪種,結合實際場景來具體問題具體分析

其實還可以細分:針對設置了過期時間的key(設置了過期時間都算,包括過期時間還沒到的)淘汰/在所有key中淘汰【FIFO沒有針對所有key,因為可能對于一些沒有設置過期時間的key,是沒有保存設置時間的】


四、緩存預熱、緩存穿透、緩存雪崩和緩存擊穿

1.緩存預熱(Cache preheating)

問題:緩存中的數據,是定期生成/實時生成的,對于定期生成這種情況是不涉及”預熱“的,而對于實時生成,redis服務器首次接入之后,服務器里面是沒有數據的。此時所有的請求都會打到mysql

解決:緩存預熱就是來解決上述問題的,把定期生成 和 實時生成結合一下,先通過離線的方式,通過一些統計的途徑,先把熱點數據找到一批,導入到redis中,此時導入的這批熱點數據,就能幫助mysql承擔很大的壓力了,隨著時間的推移,逐漸就使用新的熱點數據淘汰舊的數據


2.📚緩存穿透(Cache penetration)

是啥:

查詢的某個key,在redis中沒有,mysql也沒有,這次查詢沒有,下次查也沒有,如果這樣的數據,存在很多,并且還反復查詢,一樣也會給mysql帶來很大的壓力

為何產生:

(1)業務設計不合理,比如缺少必要的參數校驗環節,導致非法的key也被查詢了【典型

(2)開發/運維誤操作,不小心把部分數據從數據庫上誤刪了

(3)黑客惡意攻擊

解決:

(1)如果發現這個key,在redis和mysql都不存在,仍然寫入redis,value值設為非法值(比如”“)

(2)引入布隆過濾器,每次查詢redis/mysql之前都先判定一下key是否在布隆過濾器存在(把所有的key都插入到布隆過濾器中)

(3)通過改進業務/加強監控報警


3.📚緩存雪崩(Cache avalanche)

是啥:

由于在短時間內,redis上大規模的key失效,導致緩存命中陡然下降,并且mysql的壓力迅速上升,甚至直接宕機

為何產生:

(1)redis直接掛了(redis宕機/redis集群環境下大量節點宕機)

(2)redis好著,但是可能之前短時間內設置了很多key給redis,并且設置的過期時間是相同的

解決:

(1)加強監控報警,加強redis集群可用性的保證

(2)不給key設置過期時間/設置過期時間的時候添加隨機的因子(避免同一時刻過期


4.📚緩存擊穿(Cache breakdown)

是啥:相當于緩存血崩的特殊情況,針對熱點key,突然過期了,導致大量的請求直接訪問到數據庫上,甚至引起數據庫宕機【熱點key訪問頻率高,影響更大】

解決:

(1)基于統計的方式發現熱點key,并設置永不過期

(2)服務降級(適當關閉一些不重要的功能,只保留核心功能),比如訪問數據庫的時候使?分布式鎖,限制數據庫的訪問頻率


?

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

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

相關文章

中陽視角下的趨勢確認策略:以數據為核心的交易思維

中陽視角下的趨勢確認策略:以數據為核心的交易思維 在動態交易市場中,如何在波動中捕捉相對確定的趨勢,是每一位操作者關心的問題。“中陽”理念主張通過結構性價格分析,判斷市場情緒的拐點。尤其是在出現大陽線或中陽線時&#x…

【C/C++】inline關鍵詞

C inline 關鍵字學習筆記 一、什么是 inline 函數? inline(內聯)是 C 中的一個關鍵字,表示“將函數的代碼直接插入到調用點”,以減少函數調用開銷,提升執行效率。 ? 注意:inline 是一種“請求…

React useMemo函數

第一個參數是回調函數,返回計算的結果,第二個參數是依賴項,該函數只監聽count1變量的變化 import { useReducer, useState } from react; import ./App.css;// 定義一個Reducer函數 根據不同的action進行不同的狀態修改 function reducer(st…

對比測評:為什么AI編程工具需要 Rules 能力?

通義靈碼 Project Rules 在開始體驗通義靈碼 Project Rules 之前,我們先來簡單了解一下什么是通義靈碼 Project Rules? 大家都知道,在使用 AI 代碼助手的時候,有時候生成的代碼不是自己想要的,或者說生成的代碼采納后…

Java學習手冊:MyBatis 框架作用詳解

一、MyBatis 簡介 MyBatis 是一款優秀的持久層框架,用于簡化 JDBC 開發。它通過將 Java 對象與數據庫表之間的映射關系進行配置,使得開發者可以使用簡單的 SQL 語句和 Java 代碼來完成復雜的數據操作。MyBatis 支持自定義 SQL 語句,提供了靈…

list的設計

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止權限放大&#xff0c;用引用減少拷貝…

基于 PyQt 的YOLO目標檢測可視化界面+ nuitka 打包

在人工智能和計算機視覺領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一種廣泛使用的實時目標檢測算法。為了直觀地展示YOLO算法的檢測效果&#xff0c;我們使用Pyqt框架進行檢測結果的可視化&#xff0c;同時為了使其能夠脫離Python環境&#xff0c;我們…

2.1 閱讀錯題---02-04年

引言 2002年-2004年英語閱讀錯題匯總與分析總結。 一、02年閱讀 Text 1 題目&#xff1a;21題 題型&#xff1a;細節題 原因&#xff1a;單詞認錯了&#xff0c;原句中 in sympathy with 譯為 與…一致 &#xff1b;題干中的 sympathy 譯為 同情 題目&#xff1a;22題 題…

Axure疑難雜癥:中繼器制作下拉菜單(多級中繼器高級交互)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 本文視頻課程記錄于上述地址第五章中繼器專題第11節 課程主題:中繼器制作下拉菜單 主要內容:創建條件選區、多級中繼器…

即刻啟程,踏上W55MH32高性能以太網單片機學習之路!

單芯片解決方案&#xff0c;開啟全新體驗——W55MH32 高性能以太網單片機 W55MH32是WIZnet重磅推出的高性能以太網單片機&#xff0c;它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身&#xff0c;具體來說&#xff0c;一顆W55MH32內置高性能Arm Cortex-M3核心…

C++負載均衡遠程調用學習之上報功能與存儲線程池

目錄 1. Lars-reportV0.1 report模塊介紹 2.Lars-reporterV0.1 reporter項目目錄構建 3.Lars-ReporterV0.1 數據表和proto協議環境搭建 4.Lars-ReporterV0.1上報請求業務處理 5.Lars-ReporterV0.1上報請求模塊的測試 6.Lars-ReporterV0.2開辟存儲線程池-網絡存儲分離 1. L…

LabVIEW三軸電機控制

在工業自動化迅猛發展的當下&#xff0c;多軸伺服電機控制系統在制造業、3D 打印等眾多領域的需求與日俱增。它不僅要實現高精度的單軸運動控制&#xff0c;還需保障多軸協同作業的精準度&#xff0c;對響應速度也有嚴格要求。LabVIEW 開發多軸伺服電機控制系統&#xff0c;有效…

驅動開發硬核特訓 · Day 27(下篇):深入掌握 Common Clock Framework 架構與實戰開發

節。 在本篇內容中&#xff0c;我們將圍繞 Linux 內核中的時鐘子系統核心架構 —— Common Clock Framework&#xff08;簡稱 CCF&#xff09;展開深入講解&#xff0c;目標是幫助你全面理解其設計理念、主要數據結構、注冊流程、驅動實現方式&#xff0c;以及如何基于 NXP i.M…

數據庫基礎:數據庫類型與MySQL特點詳解

一、數據庫的主要類型 1. 關系型數據庫(RDBMS) 特點:基于關系模型,數據以表格形式存儲 代表產品:MySQL、Oracle、SQL Server、PostgreSQL 優勢:ACID事務支持、強一致性、成熟的SQL標準 適用場景:需要復雜查詢和事務支持的場景 2. 非關系型數據庫(NoSQL) 文檔型數據庫:Mo…

49認知干貨:產品的生命周期及類型匯總

49章:產品的生命周期與類型劃分 宇宙是運動的而非靜止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性變化,就像四季更替中的冬日枯樹、春日新芽、夏日繁茂與秋日凋零。 這也意味著:事物的發展,離不開周期的更迭與演化,死亡并非終點,而是一種新的循環轉變。 …

【2025最新】為什么用ElasticSearch?和傳統數據庫MySQL與什么區別?

Elasticsearch 深度解析&#xff1a;從原理到實踐 一、為什么選擇 Elasticsearch&#xff1f; 數據模型 Elasticsearch 是基于文檔的搜索引擎&#xff0c;它使用 JSON 文檔來存儲數據。在 Elasticsearch 中&#xff0c;相關的數據通常存儲在同一個文檔中&#xff0c;而不是分散…

Docker安裝Gitblit(圖文教程)

本章教程,使用Docker安裝部署Gitblit。 一、Gitblit簡介 Gitblit 是一個基于 Java 的 Git 倉庫管理工具,主要用于在局域網或小型團隊環境中搭建私有 Git 服務器。它提供了一個簡單易用的 Web 界面,用于瀏覽代碼、管理倉庫和用戶權限等。 二、拉取鏡像 sudo docker pull git…

nDCG(歸一化折損累計增益) 是衡量排序質量的指標,常用于搜索引擎或推薦系統

nDCG&#xff08;歸一化折損累計增益&#xff09; 是衡量排序質量的指標&#xff0c;常用于搜索引擎或推薦系統。核心思想是&#xff1a;排名越靠前的高質量結果&#xff0c;對整體評分的貢獻越大&#xff0c;但后續結果的貢獻會逐漸“打折”。最終通過對比實際排序與理想排序的…

《從線性到二維:CSS Grid與Flex的布局范式革命與差異解析》

在前端開發的廣袤宇宙中&#xff0c;CSS布局技術宛如閃耀的星辰&#xff0c;不斷革新與演進&#xff0c;為構建絢麗多彩的網頁世界提供了堅實的支撐。其中&#xff0c;CSS Grid布局與Flex布局作為兩顆璀璨的明星&#xff0c;以其獨特的魅力和強大的功能&#xff0c;深受開發者們…

2025年01月03日美蜥(杭州普瑞兼職)一面

目錄 vue2 vue3 的區別react 性能優化react 組件傳值v-for 和 v-if 的優先級react 中多個接口請求的數據&#xff0c;需要渲染到一個列表上怎么處理百萬條數據怎么渲染vue2、vue3 的響應式原理微前端了解嗎git 版本控制git mearge 和 git rebase 的區別垂直水平居中react 中實…