用互斥鎖解決緩存擊穿

我先說一下正常的業務流程:需要查詢店鋪數據,我們會先從redis中查詢,判斷是否能命中,若命中說明redis中有需要的數據就直接返回;沒有命中就需要去mysql數據庫查詢,在數據庫中查到了就返回數據并把該數據存入redis中,若mysql數據庫中也查不到就返回null,并返回錯誤信息:該信息不存在。

代碼是用springboot+mybatis plus +redis+mysql實現的。

想看最初的mapper,service,controller層代碼,就是解決緩存擊穿之前的代碼的話,可以去我的緩存穿透文章中看看,里面有,這里就不在寫一遍了。

?下面讓我來簡單解釋一下什么是緩存擊穿:

? 緩存擊穿問題也叫熱點key問題,就是一個被高并發訪問并且緩存重建業務復雜的存儲在redis中的key突然失效,無數請求就會瞬間打到數據庫造成巨大沖擊。

?解決方法:有倆個

? 一個是互斥鎖:這個互斥鎖只能有一個線程拿到,拿到互斥鎖的線程才能去查詢數據庫,并寫入redis緩存,期間其他查詢該數據的線程會全進入等待。缺點:性能差,且存在死鎖的可能。

?另一個是邏輯過期時間:這個是不給存入的key設置過期時間,而是將過期時間寫入value中,時間過期后,一個線程獲取互斥鎖然后另開一個新線程去查詢數據庫,寫入緩存并釋放鎖。而老線程直接返回查到的舊數據,期間其他獲取互斥鎖失敗的線程查詢也會返回舊數據。缺點:有額外的內存消耗,不保證數據一致性,實現優點復雜。這個另寫一個文章來進行代碼實現。本文章只說用互斥鎖解決。

代碼實現:

?互斥鎖:實現互斥鎖,我們用的是redis的setnx key value命令,該命令只有在key不存在時才會創建成功,若key已存在就會創建失敗。

? 我們先寫一下獲取互斥鎖和釋放鎖的方法

private boolean tryLock(String key) {//參數分別是,key,value,過期時間,過期時間的單位//這里過期時間用的事先寫的靜態變量,10LBoolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", LOCK_SHOP_TTL, TimeUnit.SECONDS);return BooleanUtil.isTrue(flag); //如果直接返回flag,當flag為null時,會做拆箱,報錯空指針。}private void UnLock(String key) {stringRedisTemplate.delete(key);}

用互斥鎖解決緩存擊穿:

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate CacheClient cacheClient;public Result queryById(Long id) {//緩存穿透//Shop shop = queryWithPassThrough(id);//用互斥鎖解決緩存擊穿Shop shop = queryWithMutex(id);if (shop==null){return Result.fail("店鋪不存在");}return Result.ok(shop);}public Shop queryWithMutex(Long id) {//1.從redis查詢數據緩存String key = CACHE_SHOP_KEY + id;String shopJson = stringRedisTemplate.opsForValue().get(key);//2.判斷是否存在if (StrUtil.isNotBlank(shopJson)) { //isNOtBlank方法只有有值字符串才會返回true,null和空值都會返回false//3.存在,返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return shop;}//shopJson不存在//判斷查到的數據是否為空值(這個空值指的不是null,是空字符串)if (shopJson != null) {//返回錯誤信息return null;}//4實現緩存重建//4.1獲取互斥鎖String lockKey = LOCK_SHOP_KEY + id;boolean lock = tryLock(lockKey);//4.2判斷是否獲取成功Shop shop = null;try {if (!lock) {//4.3失敗,休眠并重試Thread.sleep(50);return queryWithMutex(id);}//4.4成功,根據id查詢數據庫shop = getById(id);//模擬數據庫重建的延時Thread.sleep(200);//5.不存在,返回錯誤if (shop == null) {//將空值緩存到redisstringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}//6.存在,寫入redisstringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {//7.釋放互斥鎖UnLock(lockKey);}//8.返回return shop;}
}

下面讓我們來用Jmeter測試一下:

?開啟100個線程去測試,結果都成功了,然后我們去idea控制臺看看查詢了數據庫幾次

?由返回信息可知,只查詢了一次數據庫,所以解決緩存擊穿成功。

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

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

相關文章

Unity DOTS技術(三)JobSystem+Burst+批處理

文章目錄 一.傳統方式二.使用JobSystemBurst方式三.批處理 在之前的例子中我們都中用的單線程與傳統的編譯器,下面我們試著使用JobSystem與打找Burst編譯器來對比一下性能的差異. 一.傳統方式 1.首先用傳統方式創建10000個方塊并讓基每幀旋轉 2.我們可以看到他的幀率是40 …

RBAC 模型梳理

1. RBAC 模型是什么 RBAC&#xff08;Role-Based Access Control&#xff09;即&#xff1a;基于角色的權限控制。通過角色關聯用戶&#xff0c;角色關聯權限的方式間接賦予用戶權限。 RBAC 模型由 4 個基礎模型組成&#xff1a; 基本模型 RBAC0&#xff08;Core RBAC&#x…

面向AI應用開發實戰分享 - 基礎篇

“前端轉AI&#xff0c;第一講來了” 引言 如果你是一名前端開發&#xff0c;同時又對AI開發很感興趣&#xff0c;那么恭喜你&#xff0c;機會來了。 如果不是也沒關系&#xff0c;同樣能幫大家了解AI應用的開發思路。 本文將帶大家從面向AI開發的基礎知識開始&#xff0c;再…

Vue3:ElementPlus分裝動態列表查詢表單和彈窗動態表單

文章目錄 概要表單組件封裝彈窗組件調用表單組件頁面列表調用查詢表單 表單組件封裝 組件代碼 <template><el-formref"ruleFormRef"class"elForm":inline"true":rules"rules":model"TableList"label-width"…

AlaSQL.js:用SQL解鎖JavaScript數據操作的魔法

簡介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

高德車道級安全預警再升級 10大場景全方位守護行車安全

今日起&#xff0c;2024年高考、端午節小長假相繼到來&#xff0c;正值新一波出行高峰到來&#xff0c;高德地圖車道級安全預警功能再次升級。升級后的車道級安全預警功能覆蓋了10大安全風險較高的行車場景&#xff0c;全方位、超視距地為用戶實時探測、預警行車風險&#xff0…

成都躍享未來教育咨詢有限公司,值得信賴!

在浩渺的教育咨詢市場中&#xff0c;成都躍享未來教育咨詢有限公司以其獨特的魅力和卓越的服務質量&#xff0c;成為了行業內的璀璨明星。作為一家致力于為學生提供全方位教育咨詢服務的公司&#xff0c;成都躍享未來教育咨詢有限公司始終堅持安全可靠的原則&#xff0c;為廣大…

樹莓派4B_OpenCv學習筆記4:測試攝像頭_imread加載顯示圖像_imwrite保存圖片

今日繼續學習樹莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;簡稱RPi或RasPi&#xff09; 本人所用樹莓派4B 裝載的系統與版本如下: 版本可用命令 (lsb_release -a) 查詢: Opencv 版本是4.5.1&#xff1a; 今日對之前的測試CSI攝像頭函數進行一些理解說明&#x…

pytorch中的zero_grad()函數的含義和使用

optimizer.zero_grad() &#xff0c;用于將模型的參數梯度初始化為0。 #反向計算 loss.backward()#反向傳播計算梯度 optimizer.step()#更新參數&#xff0c;梯度被反向計算之后&#xff0c;調用函數進行所有參數更新 #在反向傳播計算時&#xff0c;梯度的計算是累加&#xff…

降噪是什么意思?視頻如何降噪?一文了解全部

在視頻制作的過程中&#xff0c;我們經常會遇到噪音問題&#xff0c;這些噪音可能來自拍攝環境、錄制設備或其他源頭。然而&#xff0c;對于初學者來說&#xff0c;降噪是什么意思&#xff0c;以及如何有效地在視頻中進行降噪可能是一些疑惑的問題。本文將深入解釋降噪的概念&a…

【算法】深入淺出爬山算法:原理、實現與應用

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

echarts學習: 繪制雙y軸折線圖

前言 我們公司項目中的折線圖大都是雙y軸的&#xff0c;因為這些圖表往往需要同時展示水位和流量這兩種不同單位的數據&#xff0c;因此如何繪制雙y軸折線圖就是就是我所面臨的首要問題。 1.如何繪制雙y軸 將yAxis屬性的值設置為一個數組&#xff0c;并在數組中添加兩個axis對…

【LC刷題】DAY02:977 209 59

#【LC刷題】DAY02&#xff1a;977 209 59 文章目錄 977. 有序數組的平方 [link](https://leetcode.cn/problems/squares-of-a-sorted-array/description/)第一思路&#xff1a;直接排序優化&#xff1a;雙指針 209. 長度最小的子數組 [link](https://leetcode.cn/problems/min…

Apache Spark MLlib詳解

Apache Spark MLlib 是 Spark 的一個核心組件&#xff0c;提供了大量的機器學習算法和工具&#xff0c;用于在大數據集上進行數據分析和預測建模。MLlib 提供了廣泛的算法集&#xff0c;包括分類、回歸、聚類、協同過濾、降維、特征提取、頻繁模式挖掘和統計測試等。 主要特點…

記錄一次Linux啟動kafka后并配置了本地服務連接遠程kafka的地址后依舊連接localhost的問題

問題的原因 我是使用docker來安裝并啟動kafka 的&#xff0c;所以在啟動過程中并沒有太多需要配置的地方&#xff0c;基本都是從網上照搬照抄&#xff0c;沒動什么腦子&#xff0c;所以看著啟動起來了覺得就沒事了&#xff0c;但是運行項目的時候發現&#xff0c;我明明已經配…

第五屆上海市青少年算法競賽網絡同步賽(小學組)

第五屆上海市青少年算法競賽網絡同步賽(小學組)T1. 符號譯碼_網絡同步賽 內存限制: 256 Mb 時間限制: 1000 ms 題目描述 小愛為標點符號設計了一套編碼系統,編碼規則如下: [ 的編碼為 010 ] 的編碼為 101 < 的編碼為 00 > 編碼為 11 + 的編碼為 011 - 編碼為 100 根…

AI輔助論文:探索AI查重與AI降重技術

在科研領域&#xff0c;AI寫作工具如同新一代的科研利器&#xff0c;它們能夠極大提高文獻查閱、思路整理和表達優化的效率&#xff0c;本質上促進了科研工作的進步。AI寫作工具不僅快速獲取并整理海量信息&#xff0c;還幫助我們精確提煉中心思想&#xff0c;顯著提升論文寫作…

生成式人工智能的風險與治理——以ChatGPT為例

文 | 西南政法大學經濟法學院 馬羽男 以ChatGPT為代表的生成式人工智能在創造社會福利的同時&#xff0c;也帶來了諸多風險。因此&#xff0c;當務之急是結合我國生成式人工智能發展狀況&#xff0c;厘清其應用價值與潛在風險之間的關系&#xff0c;以便在不影響應用發展的前提…

0606 作業

#include <stdio.h> #include <string.h>typedef struct usr{char unm[21];char pwd[21]; }user;int main(int argc, const char *argv[]) {FILE* userfilefopen("./user_tible.txt","r");printf("輸入username:");user u;scanf(&qu…

人工智能在腫瘤預后預測中的最新研究進展|頂刊精析·24-06-07

小羅碎碎念 今天要分享的文獻主題&#xff0c;大家一定非常熟悉&#xff0c;因為絕大多數AI4cancer的文章都會提到它——預后預測&#xff0c;所以今天的文獻主題是——人工智能腫瘤預后預測。 在正式開始分享之前&#xff0c;我想先帶著大家梳理兩個問題。解決了以下兩個問…