Redis生產實戰-Redis集群故障探測以及降級方案設計

Redis 集群故障探測

在生產環境中,如果 Redis 集群崩潰了,那么會導致大量的請求打到數據庫中,會導致整個系統都崩潰,所以系統需要可以識別緩存故障,限流保護數據庫,并且啟動接口的降級機制

降級方案設計
我們在系統中操作 Redis 一般都是通過工具類來進行操作的,假設工具類有兩個 RedisCacheRedisLock,那么通過 AOP 對這兩個工具類的所有方法做一個切面,如果在這兩個類中執行 Redis 操作時,Redis 掛掉了,就會拋出異常(Redis 連接失敗),那么我們在切面的處理方法上捕捉異常,再記錄下來,判斷是 Redis 集群掛了還是展示網絡波動

判斷是集群掛掉還是網絡波動的話,我們可以配置規則,比如 30 秒內出現了 3 次 Redis 連接失敗,就認為 Redis 掛掉了(可以使用 Hotkey 配置規則),那么如何自動恢復呢?可以設置 hotkey 中的緩存過期時間,設置為 60 秒,那么緩存過期之后,會再次嘗試去操作 Redis,如果 Redis 恢復了就可以正常使用了,如果還沒有恢復,會繼續向 hotkey 中 set 數據,切面中記錄 Redis 故障代碼如下:

@Around("redisCachePointcut() || redisLockPointcut()")
public Object around(ProceedingJoinPoint point) {// 簽名信息Signature signature = point.getSignature();// 強轉為方法信息MethodSignature methodSignature = (MethodSignature) signature;// 參數名稱String[] parameterNames = methodSignature.getParameterNames();//執行的對象Object target = point.getTarget();log.debug("處理方法:{}.{}", target.getClass().getName() , methodSignature.getMethod().getName());Object[] parameterValues = point.getArgs();//查看入參log.debug("參數名:{},參數值:{}", JSONObject.toJSONString(parameterNames), JSONObject.toJSONString(parameterValues));Class returnType = methodSignature.getReturnType();// 返回類型是否布爾類型boolean booleanType = boolean.class.equals(returnType) || Boolean.class.equals(returnType);try {if (Objects.nonNull(JdHotKeyStore.get("redis_connection_failed"))) {// 值不為空表示redis連接失敗,這里就不再繼續請求redis了,直接返回false或者nulllog.error("獲取緩存失敗,redis連接失敗,直接返回 false 或者 null");if (booleanType) {return false;}return null;}return point.proceed();} catch (Throwable throwable) {log.error("執行方法:{}失敗,異常信息:{}", methodSignature.getMethod().getName(), throwable);/** redis連接失敗,不拋異常,返回空值,* 繼續用數據庫提供服務,避免整個服務異常* 一分鐘之內或者30秒之內出現了幾次redis連接失敗* 此時可以設置一個key,告訴hotkey,redis連接不上了,指定1分鐘左右的過期時間* 下次獲取緩存的時候,先根據hotkey來判斷,redis是否異常了* hotkey在1分鐘之后,會刪除key,下次再有redis請求過來,重新去看redis能否連接* 這樣可以簡單的實現redis掛掉之后直接走數據庫的降級*/if (JdHotKeyStore.isHotKey("redis_connection_failed")) {JdHotKeyStore.smartSet("redis_connection_failed", "{}");}// 讓后續操作繼續,判斷返回類型是Boolean則返回false,其他類型返回nulllog.error("緩存操作失敗,直接返回 false 或者 null");if (booleanType) {return false;}return null;}
}

如果 Redis 故障的話,通過 key=redis_connection_failed 就已經記錄下來了,那么降級操作的話,就從本地緩存 caffeine 中取數據,如果取不到,再查詢數據庫,降級流程如下:

在這里插入圖片描述

這里如果本地緩存中沒有數據的話,需要查詢數據庫之后,再將數據庫中的數據放入本地緩存中,這里還是需要加鎖的,那么我們就加本地鎖即可 ReentrantLock

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

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

相關文章

《C++20設計模式》---原型模式學習筆記代碼

C20設計模式 第 4 章 原型模式學習筆記筆記代碼 第 4 章 原型模式 學習筆記 筆記代碼 #include<iostream> #include<string>// #define VALUE_OF_ADDRESS // PP_4_2_1 (no define: PP_4_2_2) namespace PP_4_2 {class Address{public:std::string street;std::st…

《C++20設計模式》學習筆記---原型模式

C20設計模式 第 4 章 原型模式4.1 對象構建4.2 普通拷貝4.3 通過拷貝構造函數進行拷貝4.4 “虛”構造函數4.5 序列化4.6 原型工廠4.7 總結4.8 代碼 第 4 章 原型模式 考慮一下我們日常使用的東西&#xff0c;比如汽車或手機。它們并不是從零開始設計的&#xff0c;相反&#x…

超過 50% 的內部攻擊使用特權提升漏洞

特權提升漏洞是企業內部人員在網絡上進行未經授權的活動時最常見的漏洞&#xff0c;無論是出于惡意目的還是以危險的方式下載有風險的工具。 Crowdstrike 根據 2021 年 1 月至 2023 年 4 月期間收集的數據發布的一份報告顯示&#xff0c;內部威脅正在上升&#xff0c;而利用權…

基于SSM的劇本殺預約系統的設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…

【第三屆】:“玄鐵杯”RISC-V應用創新大賽(基于yolov5和OpenCv算法 — 智能警戒哨兵)

文章目錄 前言 一、智能警戒哨兵是什么&#xff1f; 二、方案流程圖 三、硬件方案 四、軟件方案 五、演示視頻鏈接 總結 前言 最近參加了第三屆“玄鐵杯”RISC-V應用創新大賽&#xff0c;我的創意題目是基于 yolov5和OpenCv算法 — 智能警戒哨兵 先介紹一下比賽&#xf…

docker容器配置MySQL與遠程連接設置(純步驟)

以下為ubuntu20.04環境&#xff0c;默認已安裝docker&#xff0c;沒安裝的網上隨便找個教程就好了 拉去mysql鏡像 docker pull mysql這樣是默認拉取最新的版本latest 這樣是指定版本拉取 docker pull mysql:5.7查看已安裝的mysql鏡像 docker images通過鏡像生成容器 docke…

大數據HCIE成神之路之數據預處理(1)——缺失值處理

缺失值處理 1.1 刪除1.1.1 實驗任務1.1.1.1 實驗背景1.1.1.2 實驗目標1.1.1.3 實驗數據解析 1.1.2 實驗思路1.1.3 實驗操作步驟1.1.4 結果驗證 1.2 填充1.2.1 實驗任務1.2.1.1 實驗背景1.2.1.2 實驗目標1.2.1.3 實驗數據解析 1.2.2 實驗思路1.2.3 實驗操作步驟1.2.4 結果驗證 1…

【STM32】ADC模數轉換器

1 ADC簡介 ADC&#xff08;Analog-Digital Converter&#xff09;模擬-數字轉換器 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁 STM32是數字電路&#xff0c;只有高低電平&#xff0c;沒有幾V電壓的概念&#xff…

安裝 DevEco Studio 后不能用本地 Node.js 打開

安裝 DevEco Studio 后第一次打開時&#xff0c;不能用本地 Node.js 打開 答&#xff1a;因為本地 Node.js 文件夾名字中有空格 Node.js路徑只能包含字母、數字、“。”、“_”、“-”、“:”和“V” 解決方法&#xff1a; 1.修改文件夾名稱 2.重新下載 注意&#xff1a;找一…

Qt 通過命令行編譯程序

前言 從服務器拉代碼到編譯成可執行文件一個腳本解決問題。使用的項目文件見上一個文章 Qt生成動態鏈接庫并使用動態鏈接庫 腳本代碼 為了方便易懂這是一個很簡單的Qt編譯腳本 call E:\vs2015\VC\vcvarsall.bat x86 rmdir /s /q my-project git clone gitgitee.com:wenbai1…

【CF245H】Queries for Number of Palindromes(字符串區間dp)

Queries for Number of Palindromes - 洛谷 # Queries for Number of Palindromes ## 題面翻譯 題目描述 給你一個字符串s由小寫字母組成&#xff0c;有q組詢問&#xff0c;每組詢問給你兩個數&#xff0c;l和r&#xff0c;問在字符串區間l到r的字串中&#xff0c;包含多少…

1-3算法基礎-標準模板庫STL

1.pair pair用于存儲兩個不同類型的值&#xff08;元素&#xff09;作為一個單元。它通常用于將兩個值捆綁在一起&#xff0c;以便一起傳遞或返回。 #include <iostream> #include <utility> using namespace std; int main() {pair<int, string> person m…

TailwindCSS 多主題色配置

TailwindCSS 多主題色配置 現在大多數網站都支持主題色變換&#xff0c;比如切換深色模式。那么我們該如何進行主題色配置呢&#xff1f; tailwind dark tailwind 包含一個 dark變體&#xff0c;當啟用深色模式時&#xff0c;可以為網站設置不同樣式 <div class"bg-whi…

ThingWorx 9.2 Windows安裝

參考官方文檔安裝配置 1 PostgreSQL 13.X 2 Java, Apache Tomcat, and ThingWorx PTC Help Center 參考這里安裝 數據庫 C:\ThingworxPostgresqlStorage 設置為任何人可以full control 數據庫初始化 pgadmin4 創建用戶twadmin并記錄口令password Admin Userpostgres Thin…

漏刻有時百度地圖API實戰開發(9)Echarts使用bmap.js實現軌跡動畫效果

Bmap.js是Echarts和百度地圖相結合開發的一款JavaScript API&#xff0c;它可以幫助用戶在web應用中獲取包括地圖中心點、地圖縮放級別、地圖當前視野范圍、地圖上標注點等在內的地圖信息&#xff0c;并且支持在地圖上添加控件&#xff0c;提供包括智能路線規劃、智能導航(駕車…

C# WPF上位機開發(通訊協議的編寫)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 作為上位機&#xff0c;它很重要的一個部分就是需要和外面的設備進行數據溝通的。很多時候&#xff0c;也就是在這個溝通的過程當中&#xff0c;上…

PyQt下使用OpenCV實現人臉檢測與識別

背景&#xff1a; 一 數字圖像處理與識別警務應用模型 基于前期所學知識&#xff0c;與公安實踐相結合&#xff0c;綜合設計數字圖像處理與識別警務應用模型,從下列4個研究課題中選擇2個進行實驗實現&#xff1a;圖像增強與復原、人臉檢測與識別、虹膜內外圓檢測與分割、車牌…

Html轉PDF,前端JS實現Html頁面導出PDF(html2canvas+jspdf)

Html轉PDF&#xff0c;前端JS實現Html頁面導出PDF&#xff08;html2canvasjspdf&#xff09; 文章目錄 Html轉PDF&#xff0c;前端JS實現Html頁面導出PDF&#xff08;html2canvasjspdf&#xff09;一、背景介紹二、疑問三、所使用技術html2canvasjspdf 四、展示開始1、效果展示…

C語言----文件操作(一)

一&#xff1a;C語言中文件的概念 對于文件想必大家都很熟悉&#xff0c;無論在windows上還是Linux中&#xff0c;我們用文件去存儲資料&#xff0c;記錄筆記&#xff0c;常見的如txt文件&#xff0c;word文檔&#xff0c;log文件等。那么&#xff0c;在C語言中文件是什么樣的存…

threadpool github線程池學習

參考項目 https://github.com/progschj/ThreadPool 源碼分析 // 常規頭文件保護宏, 避免重復 include #ifndef THREAD_POOL_H #define THREAD_POOL_H// 線程池, 存儲線程對象; #include <vector>// 任務隊列, 雙向都可操作隊列, queue 不能刪除首個元素 #include <…