最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis應(yīng)用問題及分布式鎖使用說明

 更新時間:2026年03月07日 15:33:17   作者:祁仙森  
文章主要討論了緩存穿透、緩存雪崩和分布式鎖在高并發(fā)場景下的解決方案,包括對空值緩存、設(shè)置白名單、布隆過濾器監(jiān)控、預(yù)先設(shè)置熱門數(shù)據(jù)、實時調(diào)整過期時間、使用鎖機制以及構(gòu)建多級緩存架構(gòu)等

緩存穿透

現(xiàn)象

  1. 應(yīng)用服務(wù)器壓力變大了,很多請求過來
  2. redis命中率降低
  3. 一直查詢數(shù)據(jù)庫(緩存中很多數(shù)據(jù)查詢到,就查數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫壓力增加)

原因

  • Redis查詢緩存中不存在的數(shù)據(jù)
  • 出現(xiàn)很多非正常的url訪問,一般出現(xiàn)在收到惡意攻擊的時候,根據(jù)正常的url來改變值來惡意攻擊服務(wù)器

解決方案

  • 對空值緩存:對查不到的數(shù)據(jù)做空值緩存,并設(shè)置空結(jié)果的過期時間,最長不超過五分鐘
  • 設(shè)置可訪問的名單(白名單):使用Redis的bitmaps類型定義一個可訪問的名單,名單id作為bitmaps的偏移量,每次訪問和bitmaps里面的id進行比較,不在的話,做攔截處理
  • 采用布隆過濾器
  • 進行實時監(jiān)控:人為的排查分析

緩存擊穿

現(xiàn)象特點

  1. 數(shù)據(jù)庫訪問壓力瞬時增大
  2. redis里面沒有出現(xiàn)大量key過期
  3. redis正常運行

原因

Redis某個key過期了,大量訪問使用這個key

解決方案

  1. 預(yù)先設(shè)置熱門數(shù)據(jù):在redis高峰訪問之前,把一些熱門數(shù)據(jù)提前存入到redis里面,加大key的時長
  2. 實時調(diào)整:現(xiàn)場監(jiān)控?zé)衢T數(shù)據(jù),實時調(diào)整key的過期時長
  3. 使用鎖(能避免這種情況,但是去點在于效率低下)
  • 在緩存失效的時候(判斷拿出來的值為空),不是立即去load db
  • 先使用緩存工具的某些帶成功的操作返回值的操作(比如setnx)去set一個mutex key
  • 當(dāng)操作返回成功時,在進行l(wèi)oad db的操作,并設(shè)緩存,最后刪除mutex key
  • 當(dāng)操作返回失敗時,證明有現(xiàn)成在load db操作,當(dāng)前線程睡眠一段時間再重試整個get緩存的方法

緩存雪崩

現(xiàn)象

  1. 數(shù)據(jù)庫壓力變大,服務(wù)器崩潰

原因

在極少時間段,查詢大量key的集中過期情況

解決方案

  • 構(gòu)建多級緩存架構(gòu):nginx緩存+redis緩存+其他緩存
  • 使用鎖或者隊列:用加鎖或者隊列的方式保證不會有大量的線程對數(shù)據(jù)庫一次性進行讀寫,從而避免失效時大量的并發(fā)請求落到底層存儲系統(tǒng)上。不適合高并發(fā)的情形
  • 設(shè)置過期標志更新緩存,通過緩存reload機制,預(yù)先更新緩存,在即將發(fā)生大并發(fā)前手動觸發(fā)加載緩存
  • 將緩存失效時間分散開

Redis實現(xiàn)分布式鎖

分布式鎖實現(xiàn)方案

  • 基于數(shù)據(jù)庫實現(xiàn)分布式鎖
  • 基于緩存實現(xiàn)(Redis等)
  • 基于Zookeeper

上述實現(xiàn)方式Redis性能最高,Zookeeper最可靠

Redis實現(xiàn)

  1. 最簡單的使用setnx上鎖,del解鎖,但是此時有問題,若設(shè)置鎖了,長時間不釋放鎖又會導(dǎo)致后續(xù)資源拿不到鎖的情形
  2. 上述1中鎖一直不釋放的話,可以設(shè)置過期時間來解決這個問題,時間到了自動釋放
setnx users name1
expire users 10
  1. 上述2案例有個問題,就是這個不是原子的,設(shè)置鎖后,突然故障,無法設(shè)置過期時間,也會導(dǎo)致問題,因為Redis的操作是原子的,可以使用指令,加鎖設(shè)置過期時間同時操作
set users name1 nx ex 5

分布式下鎖誤刪除

出現(xiàn)情形

假設(shè)a和b兩個線程,a線程先獲取分布式鎖,然后由于業(yè)務(wù)操作或者服務(wù)器卡頓等一系列操作造成a線程的鎖過期自動失效釋放了(而a線程還沒有數(shù)據(jù)處理完)

a釋放鎖后,b線程獲取了鎖執(zhí)行具體操作,此時a突然操作完了,然后釋放了鎖,而不是b主動釋放的

這種情形就造成了鎖誤刪除的情形

解決方案

  1. 將鎖的值設(shè)置成uuid,唯一標識,set lock uuid nx ex 10,
  2. 釋放鎖的時候首先判斷當(dāng)前uuid是否和要釋放鎖的uuid一樣,一樣釋放,不一樣不釋放

Redis分布式鎖——加鎖釋放鎖的原子性優(yōu)化

造成問題

在上述案例中的當(dāng)a上鎖,執(zhí)行具體操作的時候,然后釋放鎖步驟,也遇到了比較鎖的uuid值一樣,恰巧在del操作要執(zhí)行之前(也就是比較完成之后,刪除操作之前)鎖過期自動釋放了,然后b線程獲取了鎖,還在執(zhí)行具體的操作,a刪除的是b的鎖,這就造成的分布式下安全隱患

解決方案

在比較刪除步驟嵌入原子性的LUA腳本在釋放鎖的比較釋放進行做原子化操作

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java語言資源國際化步驟解析

    Java語言資源國際化步驟解析

    這篇文章主要介紹了Java語言資源國際化步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷

    java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷

    對靜態(tài)代碼塊以及構(gòu)造函數(shù)的執(zhí)行先后順序,一直很迷惑,直到最近看到一段代碼,發(fā)現(xiàn)終于弄懂了,所以這篇文章主要給大家介紹了關(guān)于如何判斷java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • java基礎(chǔ)之反射和泛型以及注解

    java基礎(chǔ)之反射和泛型以及注解

    這篇文章主要介紹了 java基礎(chǔ)之反射和泛型以及注解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • SpringBoot 多Profile使用與切換方式

    SpringBoot 多Profile使用與切換方式

    這篇文章主要介紹了SpringBoot 多Profile使用與切換方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • WIN7系統(tǒng)JavaEE(java)環(huán)境配置教程(一)

    WIN7系統(tǒng)JavaEE(java)環(huán)境配置教程(一)

    這篇文章主要介紹了WIN7系統(tǒng)JavaEE(java+tomcat7+Eclipse)環(huán)境配置教程,本文重點在于java配置,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Springboot 項目讀取Resources目錄下的文件(推薦)

    Springboot 項目讀取Resources目錄下的文件(推薦)

    這篇文章主要介紹了Springboot 項目讀取Resources目錄下的文件,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java如何為 PPT 中的圖形添加陰影效果

    Java如何為 PPT 中的圖形添加陰影效果

    這篇文章主要介紹了Java如何為 PPT 中的圖形添加陰影效果,幫助大家更好的利用java處理圖像,感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot依賴和代碼分開打包的實現(xiàn)步驟

    SpringBoot依賴和代碼分開打包的實現(xiàn)步驟

    本文主要介紹了SpringBoot依賴和代碼分開打包的實現(xiàn)步驟,,這種方法將依賴和代碼分開打包,一般更新只有代碼修改,Pom文件是不會經(jīng)常改動的,感興趣的可以了解一下
    2023-10-10
  • nacos注冊中心單節(jié)點ap架構(gòu)源碼解析(最新推薦)

    nacos注冊中心單節(jié)點ap架構(gòu)源碼解析(最新推薦)

    這篇文章主要介紹了nacos注冊中心單節(jié)點ap架構(gòu)源碼解析,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    在Java開發(fā)中,通常會采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下
    2023-05-05

最新評論

陇南市| 永城市| 广州市| 鹿邑县| 宁河县| 子长县| 罗城| 富川| 吉木乃县| 龙陵县| 含山县| 获嘉县| 博乐市| 葫芦岛市| 朝阳市| 荆门市| 昌宁县| 盐源县| 安陆市| 绥滨县| 安福县| 启东市| 黄山市| 灵宝市| 神农架林区| 徐州市| 上饶市| 永修县| 霞浦县| 通州市| 伊宁县| 平和县| 新竹县| 通渭县| 吉林省| 铜陵市| 金湖县| 雅安市| 运城市| 台东市| 平利县|