精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis場景 | 緩存穿透、擊穿問題

數據庫 其他數據庫
由于緩存重建耗時較長,在這時間穿插線程2,3,4進入;那么這些線程都不能從緩存中查詢到數據,同一時間去訪問數據庫,同時的去執行數據庫操作代碼,對數據庫訪問壓力過大。

場景問題及原因

緩存穿透:

原因:客戶端請求的數據在緩存和數據庫中不存在,這樣緩存永遠不會生效,請求全部打入數據庫,造成數據庫連接異常。

解決思路:

  1. 緩存空對象
  2. 對于不存在的數據也在Redis建立緩存,值為空,并設置一個較短的TTL時間問題:實現簡單,維護方便,但短期的數據不一致問題

緩存雪崩:

原因:在同一時段大量的緩存key同時失效或者Redis服務宕機,導致大量請求到達數據庫,帶來巨大壓力。

解決思路:給不同的Key的TTL添加隨機值(簡單),給緩存業務添加降級限流策略(復雜),給業務添加多級緩存(復雜)

緩存擊穿(熱點Key):

前提條件:熱點Key&在某一時段被高并發訪問&緩存重建耗時較長

原因:熱點key突然過期,因為重建耗時長,在這段時間內大量請求落到數據庫,帶來巨大沖擊

解決思路:

  1. 互斥鎖
  2. 給緩存重建過程加鎖,確保重建過程只有一個線程執行,其它線程等待問題:線程阻塞,導致性能下降且有死鎖風險
  3. 邏輯過期
  4. 熱點key緩存永不過期,而是設置一個邏輯過期時間,查詢到數據時通過對邏輯過期時間判斷,來決定是否需要重建緩存;重建緩存也通過互斥鎖保證單線程執行,但是重建緩存利用獨立線程異步執行,其它線程無需等待,直接查詢到的舊數據即可問題:不保證一致性,有額外內存消耗且實現復雜

場景問題實踐解決

完整代碼地址:https://github.com/xbhog/hm-dianping

分支:20221221-xbhog-cacheBrenkdown

分支:20230110-xbhog-Cache_Penetration_Avalance

緩存穿透:

代碼實現:

12345678910111213141516171819202122public Shop queryWithPassThrough(Long id){
//從redis查詢商鋪信息
String shopInfo = stringRedisTemplate.opsForValue().get(SHOP_CACHE_KEY + id);
//命中緩存,返回店鋪信息
if(StrUtil.isNotBlank(shopInfo)){
return JSONUtil.toBean(shopInfo, Shop.class);
}
//redis既沒有key的緩存,但查出來信息不為null,則為空字符串
if(shopInfo != null){
return null;
}
//未命中緩存
Shop shop = getById(id);
if(Objects.isNull(shop)){
//將null添加至緩存,過期時間減少
stringRedisTemplate.opsForValue().set(SHOP_CACHE_KEY+id,"",5L, TimeUnit.MINUTES);
return null;
}
//對象轉字符串
stringRedisTemplate.opsForValue().set(SHOP_CACHE_KEY+id,JSONUtil.toJsonStr(shop),30L, TimeUnit.MINUTES);
return shop;
}

上述流程圖和代碼非常清晰,由于緩存雪崩簡單實現(復雜實踐不會)增加隨機TTL值,緩存穿透和緩存雪崩不過多解釋。

緩存擊穿:

緩存擊穿邏輯分析:

首先線程1在查詢緩存時未命中,然后進行查詢數據庫并重建緩存。注意上述緩存擊穿發生的條件,被高并發訪問&緩存重建耗時較長;

由于緩存重建耗時較長,在這時間穿插線程2,3,4進入;那么這些線程都不能從緩存中查詢到數據,同一時間去訪問數據庫,同時的去執行數據庫操作代碼,對數據庫訪問壓力過大。

互斥鎖:

解決方式:加鎖;****可以采用**tryLock方法 + double check**來解決這樣的問題

在線程2執行的時候,由于線程1加鎖在重建緩存,所以線程2被阻塞,休眠等待線程1執行完成后查詢緩存。由此造成在重建緩存的時候阻塞進程,效率下降且有死鎖的風險。

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455private Shop queryWithMutex(Long id) {
//從redis查詢商鋪信息
String shopInfo = stringRedisTemplate.opsForValue().get(SHOP_CACHE_KEY + id);
//命中緩存,返回店鋪信息
if(StrUtil.isNotBlank(shopInfo)){
return JSONUtil.toBean(shopInfo, Shop.class);
}
//redis既沒有key的緩存,但查出來信息不為null,則為空字符串
if(shopInfo != null){
return null;
}
//實現緩存重建
String lockKey = "lock:shop:"+id;
Shop shop = null;
try {
Boolean aBoolean = tryLock(lockKey);
if(!aBoolean){
//加鎖失敗,休眠
Thread.sleep(50);
//遞歸等待
return queryWithMutex(id);
}
//獲取鎖成功應該再次檢測redis緩存是否還存在,做doubleCheck,如果存在則無需重建緩存。
synchronized (this){
//從redis查詢商鋪信息
String shopInfoTwo = stringRedisTemplate.opsForValue().get(SHOP_CACHE_KEY + id);
//命中緩存,返回店鋪信息
if(StrUtil.isNotBlank(shopInfoTwo)){
return JSONUtil.toBean(shopInfoTwo, Shop.class);
}
//redis既沒有key的緩存,但查出來信息不為null,則為“”
if(shopInfoTwo != null){
return null;
}
//未命中緩存
shop = getById(id);
// 5.不存在,返回錯誤
if(Objects.isNull(shop)){
//將null添加至緩存,過期時間減少
stringRedisTemplate.opsForValue().set(SHOP_CACHE_KEY+id,"",5L, TimeUnit.MINUTES);
return null;
}
//模擬重建的延時
Thread.sleep(200);
//對象轉字符串
stringRedisTemplate.opsForValue().set(SHOP_CACHE_KEY+id,JSONUtil.toJsonStr(shop),30L, TimeUnit.MINUTES);
}

} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
unLock(lockKey);
}
return shop;
}

在獲取鎖失敗時,證明已有線程在重建緩存,使當前線程休眠并重試(遞歸實現)。

代碼中需要注意的是synchronized關鍵字的使用,在獲取到鎖的時候,在判斷下緩存是否存在(失效)double-check,該關鍵字鎖的是當前對象。在其關鍵字{}中是同步處理。

推薦博客:https://blog.csdn.net/u013142781/article/details/51697672

然后進行測試代碼,進行壓力測試(jmeter),首先去除緩存中的值,模擬緩存失效。

設置1000個線程,多線程執行間隔5s。

所有的請求都是成功的,其qps大約在200,其吞吐量還是比較可觀的。然后看下緩存是否成功(只查詢一次數據庫);

邏輯過期:

思路分析:

當用戶開始查詢redis時,判斷是否命中,如果沒有命中則直接返回空數據,不查詢數據庫,而一旦命中后,將value取出,判斷value中的過期時間是否滿足,如果沒有過期,則直接返回redis中的數據,如果過期,則在開啟獨立線程后直接返回之前的數據,獨立線程去重構數據,重構完成后釋放互斥鎖。

封裝數據:這里我們采用新建實體類來實現

12345678910/**
* @author xbhog
* @describe:
* @date
@Data
public class RedisData {
private LocalDateTime expireTime;
private Object data;
}

使得過期時間和數據有關聯關系,這里的數據類型是Object,方便后續不同類型的封裝。

123456789101112131415161718192021222324252627282930313233343536373839public Shop queryWithLogicalExpire( Long id ) {
String key = CACHE_SHOP_KEY + id;
// 1.從redis查詢商鋪緩存
String json = stringRedisTemplate.opsForValue().get(key);
// 2.判斷是否存在
if (StrUtil.isBlank(json)) {
// 3.存在,直接返回
return null;
}
// 4.命中,需要先把json反序列化為對象
RedisData redisData = JSONUtil.toBean(json, RedisData.class);
Shop shop = JSONUtil.toBean((JSONObject) redisData.getData(), Shop.class);
LocalDateTime expireTime = redisData.getExpireTime();
// 5.判斷是否過期
if(expireTime.isAfter(LocalDateTime.now())) {
// 5.1.未過期,直接返回店鋪信息
return shop;
}
// 5.2.已過期,需要緩存重建
// 6.緩存重建
// 6.1.獲取互斥鎖
String lockKey = LOCK_SHOP_KEY + id;
boolean isLock = tryLock(lockKey);
// 6.2.判斷是否獲取鎖成功
if (isLock){
exectorPool().execute(() -> {
try {
//重建緩存
this.saveShop2Redis(id, 20L);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
unLock(lockKey);
}
});
}
// 6.4.返回過期的商鋪信息
return shop;
}

當前的執行流程跟互斥鎖基本相同,需要注意的是,在獲取鎖成功后,我們將緩存重建放到線程池中執行,來異步實現。

線程池代碼:

12345678910111213141516/**
* 線程池的創建
* @return
*/
private static ThreadPoolExecutor exectorPool(){
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
//根據自己的處理器數量+1
Runtime.getRuntime().availableProcessors()+1,
2L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
return executor;
}

緩存重建代碼:

1234567891011121314/**
* 重建緩存
* @param id 重建ID
* @param l 過期時間
*/
public void saveShop2Redis(Long id, long l){
//查詢店鋪信息
Shop shop = getById(id);
//封裝邏輯過期時間
RedisData redisData = new RedisData();
redisData.setData(shop);
redisData.setExpireTime(LocalDateTime.now().plusSeconds(l));
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY+id,JSONUtil.toJsonStr(redisData));
}

測試條件:100線程,1s線程間隔時間,緩存失效時間10s。

測試環境:緩存中存在對應的數據,并且在緩存快失效之前修改數據庫中的數據,造成緩存與數據庫不一致,通過執行壓測,來查看相關線程返回的數據情況。

從上述兩張圖中可以看到,在前幾個線程執行過程中店鋪name為102,當執行時間從19-20的時候店鋪name發生變化為105,滿足邏輯過期異步執行緩存重建的需求.?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-03-16 14:57:24

Redis面試雪崩

2019-10-12 14:19:05

Redis數據庫緩存

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-03-08 00:07:51

緩存雪崩數據庫

2019-11-05 14:24:31

緩存雪崩框架

2024-04-07 00:00:02

Redis雪崩緩存

2023-04-14 07:34:19

2024-04-18 11:43:28

緩存數據庫Redis

2022-11-18 14:34:28

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2025-06-30 01:55:00

2023-11-10 14:58:03

2020-10-23 10:46:03

緩存雪崩擊穿

2024-03-12 10:44:42

2023-05-15 10:03:00

Redis緩存穿透

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2020-10-13 07:44:40

緩存雪崩 穿透

2025-10-20 07:49:26

穿透雪崩Redis
點贊
收藏

51CTO技術棧公眾號

最新亚洲视频| 白白在线精品| 日韩一区中文字幕| 不卡视频一区二区| 五月婷婷色丁香| 欧美精品尤物在线观看| 欧美一级爆毛片| 少妇大叫太大太粗太爽了a片小说| 神马午夜在线观看| 日韩二区三区四区| 视频在线观看一区二区| 日本精品一二三区| 高清亚洲高清| 精品久久久久久久久久久久久 | 岛国精品在线播放| 国产精品成人一区二区| 毛片aaaaa| 狠狠操综合网| 亚洲а∨天堂久久精品9966 | 久久久久久久久久网站| 婷婷精品在线观看| 日韩视频不卡中文| 一区二区三区视频在线观看免费| 日本乱理伦在线| 日本一区二区高清| 久久影视中文粉嫩av| 国产精品久久久久久久久久久久久久久久| 亚洲精选在线| 欧美裸身视频免费观看| 在线观看免费黄色网址| 偷拍自拍亚洲色图| 精品99一区二区| 手机在线国产视频| 怡红院成人在线| 精品福利一区二区| 黄色成人在线免费观看| 日本在线www| 国产日韩亚洲欧美综合| 久久久久久久久久久久久久久久av | 久久久国产精品| 一区二区三区国产视频| 亚洲调教欧美在线| 日韩精品视频中文字幕| 欧美猛男超大videosgay| 国产成人av影视| 国产在线观看www| 亚洲一区二区偷拍精品| 日本a级片在线观看| 欧美猛烈性xbxbxbxb| 中文字幕国产一区| 日韩精品欧美在线| 国产专区在线| 国产亚洲精品中文字幕| 欧美日韩免费观看一区| 青青青草网站免费视频在线观看| av综合在线播放| 国产日韩在线一区二区三区| 国产小视频免费观看| 国产成a人亚洲精| julia一区二区中文久久94| a级片在线播放| 国产精品一区二区三区网站| 99re在线国产| 丰满人妻一区二区三区无码av | 一本一道久久a久久精品 | 久久久久久久有限公司| 深夜福利视频在线免费观看| 91在线精品秘密一区二区| 久久久综合香蕉尹人综合网| 日韩av高清在线| 国产视频一区在线播放| 天天人人精品| 国产传媒在线播放| 亚洲成人综合视频| 日韩精品一区二区三区久久| 久久亚洲导航| 久久久久久香蕉| 中文字幕av网址| 精品国产一级| 日韩精品自拍偷拍| 国产在线观看免费播放| 超碰成人免费| 精品小视频在线| 日本性高潮视频| 99视频精品全部免费在线视频| 久久精品人人做人人爽| 久久久全国免费视频| 日韩一区二区久久| 国产精品va在线播放我和闺蜜| 在线观看一二三区| 国产.欧美.日韩| 欧美日韩精品久久| 成年人黄视频在线观看| 天天av天天翘天天综合网 | 一区二区三区四区激情| 男的插女的下面视频| 偷拍视频一区二区三区| 欧美精品 日韩| 182在线视频| 日韩精品一区二区久久| 国内精品久久久久影院 日本资源| 丁香社区五月天| 国产成人一级电影| 日韩欧美精品一区二区| 青春草免费在线视频| 色素色在线综合| 99日在线视频| 国产成人精品免费视| 欧美成人在线免费| 在线永久看片免费的视频| 国产美女精品一区二区三区| 久久av一区二区| 18+激情视频在线| 欧美综合欧美视频| 插我舔内射18免费视频| 国产精品不卡| 国产精品xxxxx| 日本黄色不卡视频| 亚洲天堂免费看| 青青在线视频免费| 欧美jizz19性欧美| 精品自拍视频在线观看| 中文字幕a级片| 久久综合色综合88| 久操手机在线视频| 日韩久久一区| 亚洲性av网站| 国产一区二区99| 成人亚洲一区二区一| 一区二区不卡在线视频 午夜欧美不卡'| 91福利在线尤物| 欧美一卡2卡三卡4卡5免费| 黄色国产在线播放| 天堂成人免费av电影一区| 国产精品一区二区三区观看| 成年人网站在线| 欧美情侣在线播放| 夫妇交换中文字幕| 久久久水蜜桃av免费网站| 国产在线资源一区| 欧美xxxxhdvideosex| 日韩欧美一级片| 九九精品视频免费| 精品在线亚洲视频| 在线观看欧美一区| 成人国产精品一区二区免费麻豆| 亚洲色图15p| 国产精品21p| 99精品视频在线免费观看| 成人免费性视频| 黄色免费大全亚洲| 97精品在线视频| 日本免费一区视频| 天天色天天操综合| 一区二区视频观看| 香蕉成人久久| 欧美一区二区综合| 69堂精品视频在线播放| 永久免费看mv网站入口亚洲| 国产亚洲久一区二区| 欧美激情一区二区三区全黄| 欧美三级理论片| 欧美成人直播| 成人欧美一区二区三区在线湿哒哒| 91社区在线观看| 在线电影院国产精品| 日韩一级片av| 成人高清免费观看| a级黄色一级片| 久久99国产精品视频| 国产精品久久久久久久久免费| 国产毛片在线| 在线综合亚洲欧美在线视频| 日本青青草视频| 成人av网站免费观看| 春日野结衣av| 第四色成人网| 亚洲a区在线视频| 91九色porn在线资源| 亚洲片av在线| 91精品国产乱码久久久久| 亚洲精品高清在线| 一出一进一爽一粗一大视频| 日韩在线a电影| 久久久久亚洲av无码专区喷水| 成人中文字幕视频| 热99精品里视频精品| 日本不卡视频| 亚洲福利在线视频| 奴色虐av一区二区三区| 亚洲免费观看高清在线观看| 波多野结衣影院| 免费观看成人鲁鲁鲁鲁鲁视频| 三级在线免费观看| 久久91精品| www.久久久| av有声小说一区二区三区| 美女av一区二区| 亚洲日本在线播放| 7777精品伊人久久久大香线蕉超级流畅 | 在线观看成人黄色| 精品人妻少妇嫩草av无码专区| 婷婷丁香激情综合| 日本黄色录像视频| 97久久人人超碰| 99日在线视频| 日本在线不卡视频一二三区| 日韩精品一区二区三区电影| 伊人久久大香线蕉综合网蜜芽| 91网站在线看| 免费欧美电影| 久久男人av资源网站| 色网站在线看| 亚洲天堂网站在线观看视频| 丰满大乳国产精品| 欧美乱妇20p| 丁香社区五月天| 亚洲成人在线免费| 黄色录像免费观看| 欧美激情在线看| av直播在线观看| 成人午夜视频网站| 亚洲精品在线视频播放| 日韩精品一级二级 | 日本不卡一二三区黄网| 国产色一区二区三区| 中文无码久久精品| 亚洲午夜精品久久久中文影院av| 亚洲国产合集| 国产精品美女久久久久av福利| 亚洲黑人在线| 国产精品久久久久久亚洲调教| 中文字幕21页在线看| 国内精品400部情侣激情| a级影片在线观看| 久久中文字幕一区| 一级日本在线| 中文字幕精品视频| 黄色在线观看网| 亚洲毛片在线观看| 亚洲av电影一区| 亚洲国产精品电影在线观看| 亚洲精品一区二区三区四区| 欧美一级片免费看| 国产欧美第一页| 884aa四虎影成人精品一区| 中文字幕在线观看国产| 在线精品视频免费观看| 天堂网免费视频| 91福利在线观看| 一级片在线免费播放| 色综合久久久久久久久| 国语对白做受69按摩| 欧美在线999| 亚洲性生活大片| 在线不卡a资源高清| 91麻豆国产在线| 91精品黄色片免费大全| 国产99久久九九精品无码免费| 日韩一区二区三区视频在线观看| 精品人妻无码一区二区色欲产成人 | 国产在线播放观看| 99亚洲一区二区| 少妇性饥渴无码a区免费| 久久伊人亚洲| 黄色手机在线视频| 国产综合成人久久大片91| 6080国产精品| 粉嫩一区二区三区性色av| 国产精品麻豆入口| 久久这里只有精品首页| 成人无码av片在线观看| 成人欧美一区二区三区视频网页| 岛国毛片在线观看| 午夜精品成人在线| 99re这里只有精品在线| 欧美日韩黄色影视| 国产喷水吹潮视频www| 亚洲精品一线二线三线| 青青草娱乐在线| www.国产一区| 日本理论片午伦夜理片在线观看| 91国产精品视频在线| 成人看片在线观看| 91免费版网站在线观看| 五月国产精品| 亚洲天堂av免费在线观看| 欧美日本国产| 日本一极黄色片| 国产一区二区电影| 亚洲色图14p| 亚洲日本在线看| 欧美bbbbbbbbbbbb精品| 欧美日韩一区二区三区在线看| 国产探花精品一区二区| 亚洲欧洲视频在线| 搞黄网站在线观看| 欧洲成人在线观看| 精品一区二区三区免费看| 蜜桃av久久久亚洲精品| 我不卡伦不卡影院| 成人免费在线小视频| 激情图区综合网| 亚洲熟妇一区二区三区| 亚洲欧美成aⅴ人在线观看| 五月激情六月丁香| 欧美一区二区视频网站| 国产女人在线视频| 久久久欧美一区二区| 日韩护士脚交太爽了| 麻豆亚洲一区| 欧美精品一级| 九色porny自拍| 91免费看`日韩一区二区| 草视频在线观看| 欧美无乱码久久久免费午夜一区| 亚洲乱码在线观看| 日韩中文字幕视频| 成人视屏在线观看| 狠狠色综合网站久久久久久久| 亚洲激情中文| 日日噜噜噜噜久久久精品毛片| 成人在线视频一区二区| 秋霞欧美一区二区三区视频免费| 色偷偷成人一区二区三区91| 欧美自拍偷拍一区二区| 久久久精品一区| 欧美亚洲黄色| 日韩免费一区二区三区| 性欧美videos另类喷潮| 亚洲美女在线播放| 一区二区三区不卡视频在线观看| 夜夜骚av一区二区三区| 综合av色偷偷网| 你懂得影院夜精品a| 久久五月天婷婷| 亚洲一区网站| 亚洲熟妇一区二区| 亚洲激情校园春色| 国产三区在线播放| 久久影视电视剧免费网站| 欧美一级做a| 亚洲精品视频一区二区三区| 日本午夜一区二区| 韩国三级hd中文字幕| 欧洲一区二区三区在线| 国产中文在线视频| 国产成人精品综合久久久| 在线日本制服中文欧美| 久久婷婷国产精品| 国产亚洲精品7777| 在线观看视频二区| 色妞欧美日韩在线| 亚洲人成777| 亚洲区成人777777精品| 国产高清不卡二三区| 免费在线观看国产精品| 精品乱码亚洲一区二区不卡| 四虎亚洲成人| 国产精品v欧美精品v日韩精品| 伊人久久综合| 国产精品伦子伦| 在线国产亚洲欧美| 日本a在线播放| 5g影院天天爽成人免费下载| 狠狠综合久久| 狠狠人妻久久久久久综合蜜桃| 欧美午夜精品久久久久久久| 国产鲁鲁视频在线观看免费| 成人性生交大片免费看小说| 这里只有精品在线| 国产二级一片内射视频播放| 日本电影亚洲天堂一区| 91在线免费看| 成人欧美一区二区三区在线观看| 一本久道久久综合婷婷鲸鱼| 亚洲成人网在线播放| 欧美日韩国产区一| 国产精品一品| 日本视频一区在线观看| 国产一区视频在线看| 国产一级做a爰片在线看免费| 日韩精品免费在线观看| 国精品产品一区| 18黄暴禁片在线观看| 久久久高清一区二区三区| 国产又色又爽又黄又免费| 欧美精品videos| 国产精品一区二区av交换| 图片区乱熟图片区亚洲| 精品国产成人av| 91ph在线| 精品国产一二| 久久精品国产77777蜜臀| 日本熟妇毛耸耸xxxxxx| 中文字幕在线成人| 麻豆精品99| 欧美在线a视频| 91久久精品一区二区三| a级影片在线|