成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis緩存雪崩、穿透、擊穿三步曲

數(shù)據(jù)庫
本文介紹了緩存雪崩產(chǎn)生的原因是因?yàn)槎虝r間內(nèi)大量緩存同時失效,而導(dǎo)致大量請求直接查詢數(shù)據(jù)庫的情況。

本文收集了一些 Redis 使用中經(jīng)常遇到的一些問題,和與之相對應(yīng)的解決方案,這些內(nèi)容不但會出現(xiàn)在實(shí)際工作中,也是面試的高頻問題,接下來一起來看。

一、緩存雪崩

緩存雪崩是指在短時間內(nèi),有大量緩存同時過期,導(dǎo)致大量的請求直接查詢數(shù)據(jù)庫,從而對數(shù)據(jù)庫造成了巨大的壓力,嚴(yán)重情況下可能會導(dǎo)致數(shù)據(jù)庫宕機(jī)的情況叫做緩存雪崩。

我們先來看下正常情況下和緩存雪崩時程序的執(zhí)行流程圖,正常情況下系統(tǒng)的執(zhí)行流程如下圖所示:

緩存雪崩的執(zhí)行流程,如下圖所示:

以上對比圖可以看出緩存雪崩對系統(tǒng)造成的影響,那如何解決緩存雪崩的問題?

緩存雪崩的常用解決方案有以下幾個。

1.加鎖排隊(duì)

加鎖排隊(duì)可以起到緩沖的作用,防止大量的請求同時操作數(shù)據(jù)庫,但它的缺點(diǎn)是增加了系統(tǒng)的響應(yīng)時間,降低了系統(tǒng)的吞吐量,犧牲了一部分用戶體驗(yàn)。

加鎖排隊(duì)的代碼實(shí)現(xiàn),如下所示:

// 緩存 key
String cacheKey = "userlist";
// 查詢緩存
String data = jedis.get(cacheKey);
if (StringUtils.isNotBlank(data)) {
    // 查詢到數(shù)據(jù),直接返回結(jié)果
    return data;
} else {
    // 先排隊(duì)查詢數(shù)據(jù)庫,在放入緩存
    synchronized (cacheKey) {
        data = jedis.get(cacheKey);
        if (!StringUtils.isNotBlank(data)) { // 雙重判斷
            // 查詢數(shù)據(jù)庫
            data = findUserInfo();
            // 放入緩存
            jedis.set(cacheKey, data);
        }
        return data;
    }
}

以上為加鎖排隊(duì)的實(shí)現(xiàn)示例,讀者可根據(jù)自己的實(shí)際項(xiàng)目情況做相應(yīng)的修改。

2.隨機(jī)化過期時間

為了避免緩存同時過期,可在設(shè)置緩存時添加隨機(jī)時間,這樣就可以極大的避免大量的緩存同時失效。

示例代碼如下:

// 緩存原本的失效時間
int exTime = 10 * 60;
// 隨機(jī)數(shù)生成類
Random random = new Random();
// 緩存設(shè)置
jedis.setex(cacheKey, exTime+random.nextInt(1000) , value);

3.設(shè)置二級緩存

二級緩存指的是除了 Redis 本身的緩存,再設(shè)置一層緩存,當(dāng) Redis 失效之后,先去查詢二級緩存。

例如可以設(shè)置一個本地緩存,在 Redis 緩存失效的時候先去查詢本地緩存而非查詢數(shù)據(jù)庫。

加入二級緩存之后程序執(zhí)行流程,如下圖所示:

二、緩存穿透

緩存穿透是指查詢數(shù)據(jù)庫和緩存都無數(shù)據(jù),因?yàn)閿?shù)據(jù)庫查詢無數(shù)據(jù),出于容錯考慮,不會將結(jié)果保存到緩存中,因此每次請求都會去查詢數(shù)據(jù)庫,這種情況就叫做緩存穿透。

緩存穿透執(zhí)行流程如下圖所示:

其中紅色路徑表示緩存穿透的執(zhí)行路徑,可以看出緩存穿透會給數(shù)據(jù)庫造成很大的壓力。

緩存穿透的解決方案有以下幾個。

1.使用過濾器

我們可以使用過濾器來減少對數(shù)據(jù)庫的請求,例如使用我們前面章節(jié)所學(xué)的布隆過濾器,我們這里簡單復(fù)習(xí)一下布隆過濾器,它的原理是將數(shù)據(jù)庫的數(shù)據(jù)哈希到 bitmap 中,每次查詢之前,先使用布隆過濾器過濾掉一定不存在的無效請求,從而避免了無效請求給數(shù)據(jù)庫帶來的查詢壓力。

2.緩存空結(jié)果

另一種方式是我們可以把每次從數(shù)據(jù)庫查詢的數(shù)據(jù)都保存到緩存中,為了提高前臺用戶的使用體驗(yàn) (解決長時間內(nèi)查詢不到任何信息的情況),我們可以將空結(jié)果的緩存時間設(shè)置得短一些,例如 3~5 分鐘。

三、緩存擊穿

緩存擊穿指的是某個熱點(diǎn)緩存,在某一時刻恰好失效了,然后此時剛好有大量的并發(fā)請求,此時這些請求將會給數(shù)據(jù)庫造成巨大的壓力,這種情況就叫做緩存擊穿。

緩存擊穿的執(zhí)行流程如下圖所示:

它的解決方案有以下幾個。

1.加鎖排隊(duì)

此處理方式和緩存雪崩加鎖排隊(duì)的方法類似,都是在查詢數(shù)據(jù)庫時加鎖排隊(duì),緩沖操作請求以此來減少服務(wù)器的運(yùn)行壓力。

2.設(shè)置永不過期

對于某些熱點(diǎn)緩存,我們可以設(shè)置永不過期,這樣就能保證緩存的穩(wěn)定性,但需要注意在數(shù)據(jù)更改之后,要及時更新此熱點(diǎn)緩存,不然就會造成查詢結(jié)果的誤差。

3.緩存預(yù)熱

首先來說,緩存預(yù)熱并不是一個問題,而是使用緩存時的一個優(yōu)化方案,它可以提高前臺用戶的使用體驗(yàn)。

緩存預(yù)熱指的是在系統(tǒng)啟動的時候,先把查詢結(jié)果預(yù)存到緩存中,以便用戶后面查詢時可以直接從緩存中讀取,以節(jié)約用戶的等待時間。

緩存預(yù)熱的執(zhí)行流程,如下圖所示:

緩存預(yù)熱的實(shí)現(xiàn)思路有以下三種:

  • 把需要緩存的方法寫在系統(tǒng)初始化的方法中,這樣系統(tǒng)在啟動的時候就會自動的加載數(shù)據(jù)并緩存數(shù)據(jù);
  • 把需要緩存的方法掛載到某個頁面或后端接口上,手動觸發(fā)緩存預(yù)熱;
  • 設(shè)置定時任務(wù),定時自動進(jìn)行緩存預(yù)熱。

小結(jié)

本文介紹了緩存雪崩產(chǎn)生的原因是因?yàn)槎虝r間內(nèi)大量緩存同時失效,而導(dǎo)致大量請求直接查詢數(shù)據(jù)庫的情況,解決方案是加鎖、隨機(jī)設(shè)置過期時間和設(shè)置二級緩存等。

還介紹了查詢數(shù)據(jù)庫無數(shù)據(jù)時會導(dǎo)致的每次空查詢都不走緩存的緩存穿透問題,解決方案是使用布隆過濾器和緩存空結(jié)果等。

同時還介紹了緩存在某一個高并發(fā)時刻突然失效導(dǎo)致的緩存擊穿問題,以及解決方案——加鎖、設(shè)置永不過期等方案,最后還介紹了優(yōu)化系統(tǒng)性能的手段緩存預(yù)熱。

責(zé)任編輯:趙寧寧 來源: 程序員wayn
相關(guān)推薦

2020-03-16 14:57:24

Redis面試雪崩

2019-10-12 14:19:05

Redis數(shù)據(jù)庫緩存

2023-03-10 13:33:00

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

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫

2022-11-18 14:34:28

2019-11-05 14:24:31

緩存雪崩框架

2024-04-07 00:00:02

Redis雪崩緩存

2023-04-14 07:34:19

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2022-05-27 07:57:20

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

2020-10-23 10:46:03

緩存雪崩擊穿

2023-11-10 14:58:03

2025-06-30 01:55:00

2024-03-12 10:44:42

2023-01-31 08:37:11

緩存穿透擊穿

2012-08-08 17:05:36

App運(yùn)營

2024-01-19 20:42:08

Redis數(shù)據(jù)庫Key

2020-10-13 07:44:40

緩存雪崩 穿透

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久999| 欧美精品一区二区在线观看 | 日本网站免费在线观看 | 欧美在线观看网站 | 欧美一级特黄aaa大片在线观看 | 色噜噜亚洲男人的天堂 | 亚洲一视频 | 欧美一区二区在线播放 | 亚洲人精品午夜 | 午夜影院操| xx视频在线观看 | 精品免费国产一区二区三区四区介绍 | 国产成人精品一区二三区在线观看 | 国产精品一区二区av | 欧美久久一区二区三区 | 黄色大片免费网站 | 久久精品视频免费看 | 国产免费观看一级国产 | 午夜精品久久久久久不卡欧美一级 | 欧美精品久久久 | 北条麻妃一区二区三区在线观看 | 国产中文区二幕区2012 | 成人区精品一区二区婷婷 | 久久91精品久久久久久9鸭 | 射欧美 | 国产免费让你躁在线视频 | 欧美日韩精品一区 | 成人在线免费 | 国产视频精品视频 | 亚洲精品一区二区三区中文字幕 | 日本网站免费观看 | 青青久在线视频 | 区一区二在线观看 | 久久久精彩视频 | 伊人久久一区二区 | 亚洲精品一区av在线播放 | 成人a免费 | 国产一区二区视频免费在线观看 | 超碰综合 | 成人免费观看男女羞羞视频 | 成人欧美一区二区三区黑人孕妇 |