基于Redis設計一個高可用的緩存

本文為您介紹,如何逐步設計一個基于Redis的高可用緩存。

目錄

業務背景

步驟一:寫一個最簡單的緩存設計

存在的問題:大量冷數據占據Redis內存

解決思路:讓緩存自主釋放

步驟二:為緩存設置超時時間

存在的問題:熱點緩存也會失效

解決思路:為熱點緩存續命

步驟三:數據查詢緩存后,重新設置緩存過期時間,為其續命

存在的問題:緩存擊穿/緩存失效

解決思路:如何保證緩存不同一時間失效

步驟四:為緩存設置不一樣的失效時間?編輯

存在的問題:緩存穿透

解決思路:攔截查詢不存在數據請求,禁止直擊數據庫

步驟五:為不存在的數據創建空緩存并為其指定過期時間,并對重復請求的空緩存續命?編輯

存在的問題:冷數據突變熱數據,導致眾多獲取冷數據的請求直接打在了數據庫

解決思路:只讓一個查詢冷數據的請求查詢數據庫并為其創建緩存,其他請求查緩存

總結:上述鎖已經能解決99%的問題,但是還存在一定缺陷

業務背景

本文將以如何查詢,更改個商品的為例,講述高并發下,如何設計一個高并發緩存。

步驟一:寫一個最簡單的緩存設計

以下代碼是常見的最簡單的redis緩存的設計:

  • 新增、更改數據時,更新緩存。
  • 查詢時,先查詢緩存。
    • 緩存存在,直接返回。
    • 緩存不存在,查詢數據庫,且更新緩存數據。

存在的問題:大量冷數據占據Redis內存

在數據少,壓力小,并發小的情況下,這個設計似乎沒有什么大問題,但是在數據量大,高并發的情況下,卻會有不少問題。
例如系統有上億數據,但是用戶經常訪問的數據,只有幾百萬數據,那么大量冷數據常駐Redis內存,造成redis內存浪費。

解決思路:讓緩存自主釋放

既然這個數據在一段時間內無人問津,那么是不是可以根據一定規則,讓緩存自主失效就可以了?那么為緩存設計一個失效時間就可以了?

步驟二:為緩存設置超時時間

存在的問題:熱點緩存也會失效

在為緩存設置超時時間后,那么熱點數據的緩存,在該設置的時間內,也會失效,那么緩存失效后,大量請求查詢無緩存后,都會請求到數據庫,這樣會造成數據庫的壓力增大。

解決思路:為熱點緩存續命

如何在緩存設置了失效時間后,只是讓冷數據失效,熱數據不失效呢?此時您有沒有想到為熱點數據的緩存續命的方法嗎?那就每次請求查詢緩存后,為該緩存重新設置緩存失效時間,延長其失效時間,這樣是不是就為其續命了呢?

步驟三:數據查詢緩存后,重新設置緩存過期時間,為其續命

存在的問題:緩存擊穿/緩存失效

上述方案中,如果您批量導入數據或者批量新增數據,那么這些數據建立緩存時緩存失效的時間會差不多一樣,那么就會出現大批量緩存在同一時間失效可能導致大量請求同時穿透緩存直達數據庫,可能會造成數據庫瞬間壓力過大甚至掛掉。

解決思路:如何保證緩存不同一時間失效

上述方案中,大量請求直擊數據庫的主要原因是因為緩存失效的時間也是同一時間,那么如何讓緩存失效時間不一樣呢?在設置緩存失效時,給設置不一樣的時間是不是就可以了?例如在設計緩存時在設定時間上再加上一個隨機時間。

步驟四:為緩存設置不一樣的失效時間

存在的問題:緩存穿透

寫到這里,您是不是覺得,這下沒有問題了吧?還有一下小概率時間還未考慮到呢,比如緩存穿透的問題。
緩存穿透:

  • 是指查詢一個根本不存在的數據,緩存層和存儲層都不會命中。
  • 緩存穿透將導致不存在的數據每次請求都要到存儲層去查詢, 失去了緩存保護后端存儲的意義。

造成緩存穿透的基本原因:

  • 自身業務代碼或者數據出現問題。
  • 一些惡意攻擊、 爬蟲等造成大量空命中。

解決思路:攔截查詢不存在數據請求,禁止直擊數據庫

怎么攔截這些查詢不存在數據的請求呢?究其根本原因是,請求第一次查詢緩存時,緩存沒有,又繼續查詢數據庫,數據庫沒有的就直接返回了。同樣的請求會重復這樣的動作。

想一下如何能攔截除第一次以外這樣的請求呢?那可不可以在第一次這樣的請求后,在其查詢數據庫也沒有的后,仍然為其創建一個空緩存,這樣其他請求是不是就會被攔截到緩存層,就不會直擊數據庫了呢?

只是為其創建一個空緩存就夠了嗎?那么惡意攻擊后,這樣Redis中是不是還會存在這種大量的空緩存,浪費Redis 內存呢? 同樣的,還需為其加一個過期時間。

那么如果對同一個不存在的數據惡意請求呢?那是不是還需要為其對應的空緩存續命呢?

步驟五:為不存在的數據創建空緩存并為其指定過期時間,并對重復請求的空緩存續命

存在的問題:冷數據突變熱數據,導致眾多獲取冷數據的請求直接打在了數據庫

比如大V直播間對冷產品的推廣,導致大量用戶同一時間搶購同一冷商品(緩存已經過期),導致大量請求直達數據庫,造成數據庫壓力突然暴增。

解決思路:只讓一個查詢冷數據的請求查詢數據庫并為其創建緩存,其他請求查緩存

如何讓眾多請求中的一個查詢查詢數據庫,并創建緩存,而其他請求查詢該請求創建后的緩存呢?這聽起來是不是有一個順序的含義?談到順序,您是否想到鎖機制呢?是的,這種場景,可以使用一把鎖,解決該問題,思路如下:

當多個請求過來時,查詢緩存沒有數據時,要去查數據庫前,獲取一把鎖,這樣就能保證有一個請求該數據后,這個數據就存在了緩存中。

在獲取鎖后,再查詢一次緩存,保證其他請求,獲取鎖后,直接查緩存,然后直接返回。

總結:上述鎖已經能解決99%的問題,但是還存在一定缺陷

雖然上述鎖已經解決了大多數問題,但還是有一些小概率問題會出現,例如以下問題:

  • 緩存與數據庫雙寫不一致問題。
    例如線程A查詢緩存為空,然后去讀數據庫,在讀完數據庫后,準備寫緩存時,系統卡頓了,就在這期間,有一個線程B將數據做了更改,但待系統恢復后,線程A繼續執行寫入緩存的操作,但此時數據庫中的內容已經是線程B更改過的數據了。
  • 熱點數據突然暴增導致系統奔潰問題。
    熱點數據突然訪問過大,同一時刻又幾十萬、上百萬的請求過來,Redis單節點也就能扛10萬的并發,這種超大壓力,都可能打垮Redis,導致系統崩潰。
  • 緩存雪崩問題。
    緩存雪崩指的是緩存層由于某些原因不能提供服務,導致大量請求都會打到存儲層, 存儲層的調用量會暴增, 最終造成存儲層也會級聯宕機的情況。

根據前面分析解決每個緩存設計出現問題的思路,針對這三個問題,您是否有解決思路呢?如果沒有,您可參見https://blog.csdn.net/weixin_43134177/article/details/134151930,為您提供一定解決方案。

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

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

相關文章

從原理到實踐:LVS+Keepalived構建高可用負載均衡集群

從原理到實踐:LVSKeepalived構建高可用負載均衡集群 文章目錄從原理到實踐:LVSKeepalived構建高可用負載均衡集群一、為什么需要LVSKeepalived?二、核心原理:Keepalived與VRRP協議1. VRRP的核心思想2. Keepalived的三大功能三、LV…

iOS混淆工具實戰 在線教育直播類 App 的課程與互動安全防護

近年來,在線教育直播類 App 已成為學生與培訓機構的重要工具。無論是 K12 教育、職業培訓,還是興趣學習,App 中承載的課程視頻、題庫與互動邏輯都是極高價值的內容資產。 然而,教育直播應用同樣面臨多重安全風險:課程視…

第2節-過濾表中的行-BETWEEN

摘要: 在本教程中,您將學習如何在 WHERE 子句中使用 PostgreSQL 的 BETWEEN 運算符來檢查某個值是否在兩個值之間。 PostgreSQL BETWEEN 運算符 BETWEEN運算符是一種比較運算符,如果某個值介于兩個值之間,則返回true。 以下是 BETWEEN 運算符…

Windows 11 手動下載安裝配置 uv、配置國內源

Windows 11 手動下載安裝配置 uv、配置國內源 本文對應的講解視頻鏈接:https://www.bilibili.com/video/BV1WnYTzZEpW 文章目錄Windows 11 手動下載安裝配置 uv、配置國內源1. 下載、安裝、配置 uv2. 參考信息重要聲明: uv 的安裝有很多種方式&#xff…

平板熱點頻繁斷連?三步徹底解決

平板反復斷開熱點連接是一個非常常見且令人煩惱的問題。這通常不是單一原因造成的,而是多種因素疊加的結果。 我們可以從熱點發射設備(手機等)、平板本身、以及環境因素三個方面來排查和解決。 一、 熱點發射端(通常是手機&#x…

Qt文件操作的學習(三)

一、實現簡易文本編輯器 主要用到帶菜單欄的窗口,而非單一窗口。QT已經寫好相關操作,就不在重新造輪子了功能設計:新建文本文檔,打開文件,保存文件,另存為 這次不同于之前直接可以在控件上面右擊槽了&…

ArcGIS學習-20 實戰-縣域水文分析

水文分析任務提取區域內水流方向、匯流累積量、河網、流域、子流域前置操作環境更改加載數據檢查投影坐標系河網分析洼地填充限制默認為空,認為所有洼地都是需要填充的,這里更正一下Fill_DEM需要加上后綴.tif流向分析得到流量分析得到這里的黑色代表非河…

本地 Docker 環境 Solr 配置 SSL 證書

一、簡介 在本地開發環境中為 Solr 配置 SSL 證書,是提升開發與測試一致性的關鍵步驟。尤其是在涉及安全傳輸需求的場景中,本地環境的 HTTPS 配置能有效避免因環境差異導致的問題。本文將詳細介紹如何利用 Docker 容器,快速為 Solr 服務配置自簽名 SSL 證書,實現本地 HTTP…

MacOS 運行CosyVoice

CosyVoic主要特點:1、支持中文、英文、上海話、天津話、四川話等方言。語音非常自然。2、支持3秒語音零樣本克隆,效果非常好。3、克隆時間比較長(取決于GPU性能,使用H20以滿足低延遲輸出),L4 克隆默認文本需…

我不是掛王-用python實現燕雙鷹小游戲3

在前兩個版本的更新后,越來越多內容,操作和運行也不方便,優化第三版本窗口可視化界面 本次版本更新使得可讀性和可操作性大幅度增加,前面2版本可分別參考 我不是掛王-用python實現燕雙鷹小游戲 和 我不是掛王-用python實現燕雙鷹小游戲2 一.燕雙鷹窗口可視化(燕雙鷹3.0) 新燕雙…

裝飾(Decorator)模式可以在不修改對象外觀和功能的情況下添加或者刪除對象功能

試題(35)、(36)某系統中的文本顯示類(TextView)和圖片顯示類(PictureView)都繼承了組件類(Component),分別顯示文本和圖片內容,現需要…

深度學習基礎概念【持續更新】

1. 梯度消失如果網絡中某一層的激活函數(如 sigmoid 或 tanh)在輸入較大的情況下有很小的梯度(比如接近零),那么當這些小的梯度通過多層反向傳播時,它們會逐漸變得更小。這意味著在深層網絡的前面幾層&…

上下文工程:AI應用成功的關鍵架構與實踐指南

在AI應用開發中,模型能力只決定性能上限,而上下文質量決定性能下限——上下文工程正是確保AI系統理解用戶意圖、生成準確響應的核心工程技術,已成為區分普通AI應用與卓越AI應用的關鍵因素。一、上下文工程:AI應用的新核心競爭力 1…

數據傳輸優化-異步不阻塞處理增強首屏體驗

背景:主 project 頁面中會將視頻存儲到云端后獲得 ID ,然后用 ID 調用 后端API POST到數據庫后拿到掛載頁面URL,接著傳入視頻分享組件(由于視頻分享子組件的目標是分享視頻掛載頁面,所以前置步驟不能少)con…

【芯片設計-信號完整性 SI 學習 1.0 -- SI 介紹】

文章目錄一、SoC 設計驗證階段的 SI 測試主要工作舉例二、芯片 Bringup 階段的 SI 測試主要工作舉例三、SI-PI 聯合仿真主要內容舉例四、整體總結一、SoC 設計驗證階段的 SI 測試 在 前硅階段(pre-silicon),設計團隊需要確保 SoC 與外設接口…

C語言鏈表設計及應用

鏈表鏈表節點設計鏈表項目鏈表中的傳址調用檢查申請空間鏈表尾插鏈表頭插鏈表尾部刪除鏈表頭部刪除鏈表的查找指定位置之前插入指定位置之后插入數據刪除指定位置(節點)數據刪除指定位置(節點)之后的數據鏈表的銷毀前面學習了順序…

使用 YAML 自動化 Azure DevOps 管道

1. 在 Azure DevOps 中設置 YAML 管道 開始之前,您需要擁有一個 Azure DevOps 帳戶和一個 git 倉庫。 要創建 YAML 管道, 1. 導航至 Azure DevOps → 選擇您的項目 2. 前往“管道”→ 點擊“新建管道” 3. 選擇您的倉庫(Azure Repos、GitHub 等) 4. 選擇“Starter Pipelin…

基于Spring Boot的幼兒園管理系統

基于Spring Boot的幼兒園管理系統 源碼獲取:https://mbd.pub/o/bread/YZWXlZtsbQ 引言 在數字化轉型的浪潮中,教育行業的信息化建設顯得尤為重要。幼兒園作為基礎教育的重要環節,其管理系統的現代化水平直接關系到教育質量和運營效率。本文…

【NVIDIA-B200】 ‘CUDA driver version is insufficient for CUDA runtime version‘

目錄 一、錯誤核心原因 二、排查步驟 1. 檢查當前驅動版本 2. 檢查 CUDA 運行時版本 3. 驗證驅動與 CUDA 的兼容性 三、解決方法 1. 確保驅動正確加載 2. 重新安裝匹配的驅動與 CUDA 3. 驗證環境正確性 四、關鍵注意事項 報錯日志: bash nccl.sh ------------5.安…

Android中如何實現自動化測試

目錄 前言: 一、方法介紹 1、UI Automator 3、shell腳本 二、shell腳本實現自動化測試原理和步驟 1、 原理 2、步驟 三、shell自動化測試實例 前言: 在開發項目的過程中,我們將某個階段的需求完成并且提測,通常,在測試工程師更細致的測…