Redis系列-3 Redis緩存問題

1.緩存的作用

數據庫(如Mysql)的持久化特點帶來了較低的性能,高并發的場景下,連接池很快被耗盡而出現宕機或DOS,無法繼續對外提供服務。相對于數據庫的硬盤IO,緩存中間件基于內存進行讀寫,從而具備較大的吞吐量和高并發抵抗能力。

在服務器與數據庫之間添加一層緩存,一方面可以緩解數據庫壓力,適應高并發場景;另一方面可以提高服務器的響應速度(內存讀寫速度遠高于磁盤IO),具體流程如下所示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1Llifcjw-1714982408769)(C:\Users\0216001379\AppData\Roaming\Typora\typora-user-images\1714965497585.png)]
引入緩存后,服務器會先從緩存服務器查詢,若數據不存在,才會從數據庫查詢,并將數據庫查詢結果寫入緩存服務器。當數據被緩存至緩存服務器后,服務器后續直接從內存讀取,不再經過數據庫。

數據庫中的數據都多寫少,而且一般而言遵循二八定律,即20%為熱點數據,80%為不常用數據。內存資源較為寶貴,所以希望緩存中盡可能多的是熱點數據;過期時間、續期等機制為其提供了一個很好的解決方案。

Redis是緩存常用的方案,本文介紹的緩存服務器默認指Redis,數據庫默認指代Mysql。Redis中以鍵值對的形式存放數據。Redis之所以可以保護Mysql,是因為過濾了絕大部分請求壓力,當這部分壓力透過Redis直接轉移到Mysql時, 會導致Mysql服務宕機。有三種場景會導致這個問題,以下分章節進行介紹。

2.緩存穿透

當訪問數據庫中不存在的數據時,也不會將數據緩存到Redis中,從而每次請求都直接訪問數據庫,如同穿透了緩存一樣。攻擊者可以借此繞開Redis的緩存保護,供給服務器的數據庫,如Mysql數據庫的ID為自增序列時,高并發查詢ID為-1的數據。

如下圖所示,Redis和Mysql中不存在數據C,客戶端高并發請求C數據時,請求會全部發送到Mysql中。

在這里插入圖片描述
存在以下解決方案:

方案1:緩存空值
查詢數據據庫的結果為空時,在Redis中緩存空值并設置較短的有效時間。對于每個不存在的數據都緩存一個空值,可能導致Redis中緩存了大量無效的空值,占據內存空間;另外,在空值的有效期內,可能出現數據不一致情況(數據在數據庫中被添加了)。

方案2:布隆過濾器
布隆過濾器基于Hash函數和長數組實現,特點是可能誤判(不存在表示一定不存在,存在表示可能存在)和不可刪除,當數據變化時,需要重建(定時器執行)布控過濾器。

使用布隆過濾器的流程如下:
初始化:
在這里插入圖片描述

處理請求:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kZZX3Xdt-1714982408771)(C:\Users\0216001379\AppData\Roaming\Typora\typora-user-images\1714982323034.png)]

在《Redis系列-1 Redis介紹》中對Redission庫僅介紹了分布式鎖API的使用方式,除此之外,Redission庫還提供了大量分布式操作的API,如布隆過濾器等。

3.緩存擊穿

Redis中存放的熱點數據存在過期時間,當熱點數據過期后,客戶端的請求會穿過Redis直達數據庫。如下所示,Redis中數據C是個熱點數據,當數據C在Redis中過期而被清除后,高并發請求數據C時,請求會直達Mysql。
在這里插入圖片描述

存在以下解決方案:

方案1:加分布式鎖

查詢數據庫前,獲取分布式鎖,結合DCL可以保證每個熱點數據僅有一次查詢發送到數據庫。

方案2:熱點數據持續刷新

服務初始化時,將熱點數據刷入Redis中,同時啟動一個定時服務:定時更新熱點數據的過期時間。另外,對于特殊業務場景下,可以設置熱點數據永不過期。

3.緩存雪崩

當Redis中大量緩存過期或者Redis服務器宕機,會導致Redis對于這些數據的攔截失敗,請求會發送到Mysql.
在這里插入圖片描述

根據不同的原因,存在如下對應解決方案:

方案1:緩存預熱
啟動時進行緩存預熱,將熱點數據提前寫入Redis緩存中,避免系統啟動時高并發訪問Mysql.

方案2:緩存時間添加隨機值
緩存時間添加指定范圍的隨機值,防止緩存集中失效。

方案3:部署Redis集群
Redis宕機會導致緩存數據全局失效,可通過部署Redis集群提高可用性。

另外,還可通過添加分布式鎖來壓縮請求速度,從而給數據庫爭取處理時間;由于嚴重影響吞吐量,使用較少。

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

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

相關文章

SpringBoot:注解詳解

RequestMapping 注解在類上:表示該類中所有響應請求的方法都以此地址為父路徑 value(path) 指定請求的實際訪問地址,默認RequestMapping(“url”)的值url即為value的值。指定的地址可以是 URI Template 模式。 method 指定請求的method類型…

數據結構(四)——二叉樹和堆(下)

制作不易,三連支持一下唄!!! 文章目錄 前言一、二叉樹鏈式結構的實現總結 前言 這篇博客我們將來了解普通二叉樹的實現和應用,對大家之前分治和遞歸的理解有所挑戰。 一、二叉樹鏈式結構的實現 1.前置說明 在學習二叉…

Java入門——繼承和多態(上)

包 包是組織類的一種方式. 使用包的主要目的是保證類的唯一性. 例如, 你在代碼中寫了一個 Test 類. 然后你的舍友也可能寫一個 Test 類. 如果出現兩個同名的類, 就會沖突, 導致 代碼不能編譯通過. 導入包中的類 Java 中已經提供了很多現成的類供我們使用. 例如 public cla…

服裝店會員管理系統結合小程序商城幫你挖掘出潛在客戶

在現代社會,隨著科技的不斷進步和人們消費習慣的變化,傳統的服裝店已經不再能夠滿足消費者的需求。為了更好地服務客戶,提升銷售業績,許多服裝店開始引入會員管理系統,并結合小程序商城,實現線上線下的無縫…

LeetCode-2079. 給植物澆水【數組 模擬】

LeetCode-2079. 給植物澆水【數組 模擬】 題目描述:解題思路一:簡單的模擬題,初始化為0,考慮先不澆灌每一個植物解題思路二:初始化為n,考慮每一個植物需要澆灌解題思路三:0 題目描述&#xff1a…

在ubuntu安裝Docker容器

1、進入root用戶模式 sudo -i 回車后,輸入root的密碼即可進入root模式2、在ubuntu上安裝docker (1)直接使用 apt 安裝,一般這樣也自動啟動好了 apt install docker.io3、驗證安裝成功,以及啟動與校驗 (…

C++11:常用語法匯總

目錄 🍁統一的列表初始化 { }initializer_list 🍁decltype 推導表達式類型🍁可變參數模板解析可變參數包方法一方法二 🍁lambda 表達式捕捉列表的使用運用場景舉例lambda表達式 與 函數對象 🍁統一的列表初始化 { } 在…

STM32F407-驅動SHT41采集溫濕度

STM32F407-驅動SHT41采集溫濕度 SHT41 SHT41通過I2C方式進行驅動 從機地址: 0x44 獲取數據方式 1)先發送I2C寫,寫入特定指令 2)延時一段時間,等待SHT41處理 3)再進行I2C讀,讀數據即可 一些…

Ansible(二)

一、Playbook基礎 1.1 Playbook定義 Playbook其實是Ansible服務的一個配置文件,Ansible使用Playbook的YAML語言配置編寫成操作需求,實現對遠端主機或策略部署,實現對遠端主機的控制與管理。 1.2 Playbook組成 Tasks:任務&…

【Qt 學習筆記】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主頁:Duck Bro 博客主頁系列專欄:Qt 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章編號&#x…

skynet - spinlock 簡單的自旋鎖

spinlock.h 代碼位于: https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 該文件內,根據不同環境提供了 3 種 api 實現: pthread_mutex_t 系列函數gcc 內置原子操作函數std atomic 系列函數 看了下,效率最…

滲透測試-信息收集

網絡安全信息收集是網絡安全領域中至關重要的一環,它涉及到對目標系統、網絡或應用進行全面而細致的信息搜集和分析。這一過程不僅有助于理解目標網絡的結構、配置和潛在的安全風險,還能為后續的滲透測試、風險評估和安全加固提供有力的支持。 在網絡安…

安卓開發--新建工程,新建虛擬手機,按鍵事件響應(含:Android中使用switch-case遇到case R.id.xxx報錯)

安卓開發--新建工程,新建虛擬手機,按鍵事件響應 1.前言2.運行一個工程2.1布局一個Button2.2 button一般點擊事件2.2 button屬性點擊事件2.2 button推薦點擊事件(含:Android中使用switch-case遇到case R.id.xxx報錯) 本…

MATLAB 多項式

MATLAB 多項式 MATLAB將多項式表示為行向量,其中包含按冪次降序排列的系數。例如,方程P(x) X 4 7 3 - 5 9可以表示為 p [1 7 0 -5 9]; 求值多項式 polyval函數用于求一個特定值的多項式。例如,在 x 4 時,計算我們之前的多項式…

HTTP URL 詳解

概述 URL 提供了一種定位因特網上任意資源的手段&#xff0c;大多數 URL 語法都由以下九個結構的通用格式組成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重裝Linux系統,無需登錄控制面板

命令重裝Linux系統&#xff0c;無需登錄控制面板 部分無法登錄控制面板使用這個腳本 自動安裝安裝腳本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安裝命令參考 # 自動安裝 Debian 10 buster …

基于YOLOV8復雜場景下船舶目標檢測系統

1. 背景 海洋作為地球上70%的表面積&#xff0c;承載著人類生活、經濟發展和生態系統的重要功能。船舶作為海洋活動的主要載體之一&#xff0c;在海上運輸、資源開發、環境監測等方面發揮著重要作用。復雜海洋環境下的船舶目標檢測成為了海事管理、海洋資源開發和環境保護等領…

人工智能軌道交通行業周刊-第79期(2024.4.22-5.12)

本期關鍵詞&#xff1a;無人機巡檢、車機聯控、減速頂、Agent、GraphRAG、RAGFlow 1 整理涉及公眾號名單 1.1 行業類 RT軌道交通人民鐵道世界軌道交通資訊網鐵路信號技術交流北京鐵路軌道交通網鐵路視點ITS World軌道交通聯盟VSTR鐵路與城市軌道交通RailMetro軌道世界鐵路那…

2024OD機試卷-API集群負載統計 (java\python\c++)

題目:API集群負載統計 題目描述 某個產品的RESTful API集合部署在 服務器 集群的多個節點上,近期對客戶端訪問日志進行了采集,需要統計各個API的訪問頻次,根據熱點信息在服務器節點之間做負載 均衡,現在需要實現熱點信息統計查詢功能。 RESTful API是由多個層級構成,層…

《動手學深度學習》V2(11-18)

文章目錄 十一、二 模型選擇與過擬合和欠擬合1、模型的選擇2、過擬合和欠擬合3、估計模型容量4、線性分類器的VC維5、過擬合欠擬合的代碼實現 :fire:①生成數據集②定義評估損失③定義訓練函數④三階多項式函數擬合⑤線性函數擬合(欠擬合)⑤高階多項式函數擬合(過擬合) 十三、權…