宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

如何防止緩存擊穿? 使用互斥鎖或熱點(diǎn) Key 永不過(guò)期策略

管理 管理 編輯 刪除

緩存擊穿完整講解 + 防御方案

一、什么是緩存擊穿(Cache Breakdown)?

定義:

某個(gè)「熱點(diǎn)Key」非常重要,訪問(wèn)量極高;

當(dāng)它 剛好過(guò)期的那一刻,大量請(qǐng)求同時(shí)訪問(wèn)該Key,由于緩存失效,會(huì) 瞬間全部打到數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力驟增,甚至宕機(jī)。


二、緩存擊穿與其他問(wèn)題的區(qū)別

問(wèn)題類型觸發(fā)條件表現(xiàn)解決方向
緩存穿透請(qǐng)求不存在的數(shù)據(jù)(數(shù)據(jù)庫(kù)也無(wú))每次都查DB加布隆過(guò)濾器或空值緩存
緩存擊穿熱點(diǎn)Key過(guò)期一瞬間DB被打爆加鎖、熱點(diǎn)Key永不過(guò)期
緩存雪崩大量Key同時(shí)過(guò)期DB壓力突增隨機(jī)過(guò)期時(shí)間 + 限流


三、緩存擊穿的防御方案

方案一:互斥鎖(Mutex Lock)

思路

當(dāng)緩存失效時(shí),只有一個(gè)請(qǐng)求能去查數(shù)據(jù)庫(kù),其余請(qǐng)求等待。

適合「高并發(fā)下的熱點(diǎn)Key」。

實(shí)現(xiàn)示意(偽代碼):

String value = redis.get("product:1001");
if (value == null) {
    // 嘗試獲取分布式鎖
    if (tryLock("lock:product:1001")) {
        // double check 避免重復(fù)查詢
        value = redis.get("product:1001");
        if (value == null) {
            value = db.query("SELECT * FROM product WHERE id=1001");
            redis.set("product:1001", value, 60);
        }
        unlock("lock:product:1001");
    } else {
        // 其他線程短暫休眠后重試
        Thread.sleep(50);
        value = redis.get("product:1001");
    }
}
return value;

常用命令:

SET lock:product:1001 1 NX EX 5
NX:僅當(dāng)鎖不存在時(shí)設(shè)置 EX:自動(dòng)過(guò)期防死鎖


方案二:熱點(diǎn) Key 永不過(guò)期 + 后臺(tái)異步更新

思路

對(duì)極熱點(diǎn)數(shù)據(jù)(如排行榜、商品詳情)——不要讓它自然過(guò)期,而是定時(shí)刷新。

做法:

  • 設(shè)置 Key 永不過(guò)期;
  • 使用定時(shí)任務(wù)或消息隊(duì)列定期更新內(nèi)容;
  • 或在請(qǐng)求線程中異步刷新:
// 異步刷新策略
if (System.currentTimeMillis() - cache.getUpdateTime("hotKey") > 10分鐘) {
    threadPool.submit(() -> refreshHotKeyFromDB());
}

優(yōu)點(diǎn):

  • 不會(huì)發(fā)生“過(guò)期瞬間擊穿”
  • 適合讀多寫少、穩(wěn)定熱點(diǎn)數(shù)據(jù)

方案三:邏輯過(guò)期(雙層時(shí)間機(jī)制)

思路

緩存中設(shè)置一個(gè)邏輯過(guò)期時(shí)間,不立即刪除數(shù)據(jù),而是由后臺(tái)線程更新。

{
  "data": {...},
  "expireTime": "2025-10-28 14:00:00"
}

邏輯:

if (now < expireTime) {
    return cache.data; // 直接返回舊值
} else {
    // 異步線程去更新DB + 緩存
    refreshAsync();
    return cache.data; // 先返回舊數(shù)據(jù),保證服務(wù)穩(wěn)定
}

優(yōu)點(diǎn):

  • 用戶始終有數(shù)據(jù)返回,不會(huì)訪問(wèn)DB暴增
  • 類似“后臺(tái)熱更新”


方案四:多級(jí)緩存(本地 + Redis)

在應(yīng)用層增加一層 本地緩存(如 Caffeine/Guava),

Redis 過(guò)期時(shí)也能頂一會(huì)兒,進(jìn)一步防止瞬間擊穿。


四、實(shí)際項(xiàng)目最佳實(shí)踐推薦

場(chǎng)景推薦方案
普通熱點(diǎn)Key(商品詳情)互斥鎖 + 雙查機(jī)制
極高熱度Key(首頁(yè)配置、排行榜)永不過(guò)期 + 定時(shí)刷新
高QPS系統(tǒng)(上億訪問(wèn))邏輯過(guò)期 + 異步刷新 + 本地緩存
分布式環(huán)境使用 Redisson 或 Redis 原生鎖


請(qǐng)登錄后查看

小碼二開 最后編輯于2025-10-28 14:22:20

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}} 【已收集】
{{item.floor}}# 沙發(fā) 板凳 地板 {{item.floor}}# 【已收集】
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
分享
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
212
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服