色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

真實(shí)案例解析緩存大熱key的致命陷阱

京東云 ? 來源:jf_75140285 ? 2025-01-24 15:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:京東零售 曹志飛

引言

在現(xiàn)代軟件架構(gòu)中,緩存是提高系統(tǒng)性能和響應(yīng)速度的重要手段。然而,如果不正確地使用緩存,可能會導(dǎo)致嚴(yán)重的線上事故,尤其是緩存的大熱key問題更是老生常談。本文將探討一個(gè)常見但容易被忽視的問題:緩存大熱key和緩存擊穿問題。我們將從一個(gè)真實(shí)案例入手,分析其原因,并提供解決方案和預(yù)防措施。

案例描述

某系統(tǒng)在雙十一大促期間,遇到了一個(gè)嚴(yán)重的線上事故。業(yè)務(wù)人員在創(chuàng)建一個(gè)大型活動,該大型活動由于活動條件和活動獎(jiǎng)勵(lì)比較多,導(dǎo)致生成的緩存內(nèi)容非常大。活動上線后,系統(tǒng)就開始出現(xiàn)各種異常告警,核心UMP監(jiān)控可用率由100%持續(xù)下降到20%,系統(tǒng)訪問Redis的調(diào)用次數(shù)和查詢性能也斷崖式下降,后續(xù)更是產(chǎn)生連鎖反應(yīng)影響了其他多個(gè)核心接口的可用率,導(dǎo)致整個(gè)系統(tǒng)服務(wù)不可用。

原因分析

在這個(gè)系統(tǒng)中,為了提高查詢活動的性能,我們開發(fā)團(tuán)隊(duì)決定使用Redis作為緩存系統(tǒng)。將每個(gè)活動信息作為一個(gè)key-value存儲在Redis中。由于業(yè)務(wù)需要,有時(shí)候業(yè)務(wù)運(yùn)營人員也會創(chuàng)建一個(gè)非常龐大的活動,來支撐雙十一期間的各種玩法。針對這種龐大的活動,我們開發(fā)團(tuán)隊(duì)也提前預(yù)料到了可能會出現(xiàn)的大key和熱key問題,所以在查詢活動緩存之前增加了一層本地jvm緩存,本地jvm緩存5分鐘,緩存失效后再去回源查詢Redis中的活動緩存,本以為會萬無一失,沒想到最后還是出了問題。

image.png


查詢方法偽代碼

ActivityCache present = activityLocalCache.getIfPresent(activityDetailCacheKey);
if (present != null) {
    ActivityCache activityCache = incentiveActivityPOConvert.copyActivityCache(present);
    return activityCache
}
ActivityCache remoteCache = getCacheFromRedis(activityDetailCacheKey);
activityLocalCache.put(activityDetailCacheKey, remoteCache);
return remoteCache;

查詢活動緩存流程如上圖所示,為什么加了本地緩存還是出了問題?
這里其實(shí)就存在著第一個(gè)緩存陷阱:緩存擊穿問題。首先解釋一下什么是緩存擊穿;緩存擊穿(Cache Miss)是指在高并發(fā)的系統(tǒng)中,如果某個(gè)緩存鍵對應(yīng)的值在緩存中不存在(即緩存失效),那么所有請求都會直接訪問后端數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫的負(fù)載瞬間增加,可能會引發(fā)數(shù)據(jù)庫宕機(jī)或服務(wù)不可用的情況。所以在本次事故里邊,運(yùn)營人員審批活動上線的一瞬間,活動緩存只是寫入到了Redis緩存中,但是本地緩存還都是空的,所以此時(shí)就會有大量請求來同時(shí)訪問Redis。
按照以往經(jīng)驗(yàn),Redis緩存都是純內(nèi)存操作,查詢性能可以滿足大量請求同時(shí)查詢活動緩存,就在此時(shí)我們卻陷入了第二個(gè)緩存陷阱:網(wǎng)絡(luò)帶寬瓶頸;Redis的高并發(fā)性能毋庸置疑,但是我們卻忽略了一個(gè)大key和熱key對網(wǎng)絡(luò)帶寬的影響,本次引發(fā)問題的大熱key大小達(dá)到了1.5M,經(jīng)過事后了解京東Redis對單分片的網(wǎng)絡(luò)帶寬也有限流,默認(rèn)200M,根據(jù)換算,該熱key最多只能支持133次的并發(fā)訪問。所以就在活動上線的同一時(shí)刻,加上緩存擊穿的影響,迅速達(dá)到了Redis單分片的帶寬限流閾值,導(dǎo)致Redis線程進(jìn)入阻塞狀態(tài),以至于所有的業(yè)務(wù)服務(wù)器都無法查詢Redis緩存成功,最終引發(fā)了緩存雪崩效應(yīng)。

解決方案

為了解決這個(gè)問題,我們開發(fā)團(tuán)隊(duì)采取了以下措施:

  1. 大key治理:更換緩存對象序列化方法,由原來的JSON序列化調(diào)整為Protostuff序列化方式。治理效果:緩存對象大小由1.5M減少到了0.5M。
  2. 使用壓縮算法:在存儲緩存對象時(shí),再使用壓縮算法(如gzip)對數(shù)據(jù)進(jìn)行壓縮,注意設(shè)置壓縮閾值,超過一定閾值后再進(jìn)行壓縮,以減少占用的內(nèi)存空間和網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。壓縮效果:500k壓縮到了17k。
  3. 緩存回源優(yōu)化:本地緩存miss后回源查詢Redis增加線程鎖,減少回源Redis并發(fā)數(shù)量。
  4. 監(jiān)控和優(yōu)化Redis配置:定期監(jiān)控Redis網(wǎng)絡(luò)傳輸情況,根據(jù)實(shí)際情況調(diào)整Redis的限流配置,以確保Redis的穩(wěn)定運(yùn)行。

治理后業(yè)務(wù)偽代碼如下:

ActivityCache present = activityLocalCache.get(activityDetailCacheKey, key -> getCacheFromRedis(key));
if (present != null) {                
    return present;
}
         
/**
* 查詢二進(jìn)制緩存
*
* @param activityDetailCacheBinKey
* @return
*/
private ActivityCache getBinCacheFromJimdb(String activityDetailCacheBinKey) {
    List activityByteList = slaveCluster.hMget(activityDetailCacheBinKey.getBytes(),"stock".getBytes());
    if (activityByteList.get(0) != null && activityByteList.get(0).length > 0) {
        byte[] decompress = ByteCompressionUtil.decompress(activityByteList.get(0));
        ActivityCache activityCache = ProtostuffUtil.deserialize(decompress, ActivityCache.class);
        if (activityCache != null) {
            if (activityByteList.get(1) != null && activityByteList.get(1).length > 0) {
                activityCache.setAvailableStock(Integer.valueOf(new String(activityByteList.get(1))));
            }
            return activityCache;
        }
    }
return null;
[]>

預(yù)防措施

為了避免類似的問題再次發(fā)生,開發(fā)團(tuán)隊(duì)采取了以下預(yù)防措施:

  1. 設(shè)計(jì)階段考慮緩存策略:在系統(tǒng)設(shè)計(jì)階段,充分考慮緩存的使用場景和數(shù)據(jù)特性,避免盲目使用大key緩存。
  2. 進(jìn)行壓力測試和性能評估:在上線前,進(jìn)行充分的壓力測試和性能評估,模擬高并發(fā)和大數(shù)據(jù)量的情況,及時(shí)發(fā)現(xiàn)和解決潛在問題。
  3. 定期進(jìn)行系統(tǒng)優(yōu)化和升級:隨著業(yè)務(wù)的發(fā)展和技術(shù)的進(jìn)步,定期對系統(tǒng)進(jìn)行優(yōu)化和升級,引入新的技術(shù)和工具來提高系統(tǒng)的性能和穩(wěn)定性。

結(jié)論

緩存大key和熱key是緩存使用中常見的陷阱,千萬不要心存僥幸,否則會引發(fā)嚴(yán)重的線上事故。通過本文的案例分析和解決方案,我們希望能夠幫助讀者更好地理解和應(yīng)對這個(gè)問題。記住,合理使用緩存是提高系統(tǒng)性能的關(guān)鍵,而不是簡單地將所有數(shù)據(jù)都存儲在緩存中。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    5152

    瀏覽量

    89210
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    246

    瀏覽量

    27169
  • key
    key
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    13086
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    LRU緩存模塊最佳實(shí)踐

    LRU(Least Recently Used)是一種緩存替換算法,它的核心思想是當(dāng)緩存滿時(shí),替換最近最少使用的數(shù)據(jù)。在實(shí)際應(yīng)用中,LRU算法被廣泛應(yīng)用于緩存、頁面置換等領(lǐng)域。Rust語言提供了一個(gè)
    的頭像 發(fā)表于 09-30 16:47 ?1206次閱讀

    緩存有大key?你得知道的一些手段

    ?? ? ? ? 背景: 最近系統(tǒng)內(nèi)緩存CPU使用率一直報(bào)警,超過設(shè)置的70%報(bào)警閥值,針對此場景,需要對應(yīng)解決緩存是否有大key使用問題,掃描緩存集群的大
    的頭像 發(fā)表于 06-19 09:38 ?1145次閱讀
    <b class='flag-5'>緩存</b>有大<b class='flag-5'>key</b>?你得知道的一些手段

    基于javaPoet的緩存key優(yōu)化實(shí)踐

    數(shù)據(jù)庫中的數(shù)據(jù)緩存在redis/本地緩存中,代碼如下: ? @Cacheable(value = { "per" }, key="#person.getId
    的頭像 發(fā)表于 01-14 15:18 ?820次閱讀
    基于javaPoet的<b class='flag-5'>緩存</b><b class='flag-5'>key</b>優(yōu)化實(shí)踐

    開關(guān)電源的設(shè)計(jì)方法解析

    開關(guān)電源的設(shè)計(jì)方法解析
    發(fā)表于 08-06 14:14

    避開無源元件的陷阱

    避開無源元件的陷阱如果選錯(cuò)無源元件,再好的運(yùn)算放大器或數(shù)據(jù)轉(zhuǎn)換器也可能會表現(xiàn)不佳本文說明需要注意的一些基本陷阱
    發(fā)表于 07-29 17:11

    緩存的作用和設(shè)計(jì)模式

    查詢數(shù)據(jù),獲取數(shù)據(jù)后并加載到緩存緩存失效:數(shù)據(jù)更新寫到數(shù)據(jù)庫,操作成功后,讓緩存失效,查詢時(shí)候再重新加載;緩存穿透:查詢數(shù)據(jù)庫不存在的對象,也就不存在
    發(fā)表于 01-05 17:57

    設(shè)計(jì)/布局的關(guān)鍵測試陷阱-Design/Layout Pit

    設(shè)計(jì)/測試重點(diǎn)布局的陷阱-Design/Layout Pitfalls Test Key 正常chip,與test key的die size, PE 建議兩者需一致.Case Study.兩者大小不一,會造成PE部門在 CP
    發(fā)表于 11-20 11:19 ?0次下載

    緩存服務(wù)器運(yùn)作的原理解析

    /O。另一方面,memcached在存儲區(qū)中對于每一個(gè)key都維護(hù)一個(gè)過期時(shí)間,一旦達(dá)到這個(gè)過期時(shí)間,memcached便會自動刪除這個(gè)key,這使得我們的過期檢查非常容易,只需要在保存緩存數(shù)據(jù)時(shí)指定過期時(shí)間即可。
    發(fā)表于 04-28 12:43 ?1255次閱讀

    如何設(shè)計(jì)一個(gè)緩存系統(tǒng)?

    則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時(shí),可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應(yīng)用,這就是漏洞。 解決方案 有很多種方法可以有效地解決
    的頭像 發(fā)表于 02-08 11:40 ?3166次閱讀

    緩存被穿透了如何解決

    首先來了解幾個(gè)概念: 緩存穿透:大量請求根本不存在的key 緩存雪崩:redis中大量key集體過期 緩存擊穿:redis中一個(gè)熱點(diǎn)
    的頭像 發(fā)表于 05-23 09:54 ?938次閱讀
    <b class='flag-5'>緩存</b>被穿透了如何解決

    proteus+key+C51源碼解析

    proteus+key+C51
    發(fā)表于 10-24 09:41 ?0次下載

    聊聊緩存擊穿的解決方法

    緩存擊穿,Redis中的某個(gè)熱點(diǎn)key不存在或者過期,但是此時(shí)有大量的用戶訪問該key。比如xxx直播間優(yōu)惠券搶購、xxx商品活動,這時(shí)候大量用戶會在某個(gè)時(shí)間點(diǎn)一同訪問該熱點(diǎn)事件。但是可能
    的頭像 發(fā)表于 10-23 13:54 ?529次閱讀

    MOS管選型十大陷阱:參數(shù)誤讀引發(fā)的血淚教訓(xùn)MDD

    在電力電子設(shè)計(jì)中,MOS管選型失誤導(dǎo)致的硬件失效屢見不鮮。某光伏逆變器因忽視Coss參數(shù)引發(fā)炸管,直接損失50萬元。本文以真實(shí)案例為鑒,MDD辰達(dá)半導(dǎo)體帶您解析MOS管選型中的十大參數(shù)陷阱,為工程師
    的頭像 發(fā)表于 03-04 12:01 ?489次閱讀
    MOS管選型十大<b class='flag-5'>陷阱</b>:參數(shù)誤讀引發(fā)的血淚教訓(xùn)MDD

    整流橋選型十大陷阱:MDD從電流諧波到散熱設(shè)計(jì)的實(shí)戰(zhàn)解析

    在工業(yè)電源設(shè)計(jì)中,整流橋選型失誤可能引發(fā)災(zāi)難性后果。某光伏逆變器項(xiàng)目因忽略反向恢復(fù)電荷(Qrr)導(dǎo)致整機(jī)效率下降8%,直接損失超百萬元。本文結(jié)合MDD(模塊化設(shè)計(jì)方法),深度解析整流橋選型中的十大
    的頭像 發(fā)表于 03-10 10:41 ?464次閱讀
    整流橋選型十大<b class='flag-5'>陷阱</b>:MDD從電流諧波到散熱設(shè)計(jì)的實(shí)戰(zhàn)<b class='flag-5'>解析</b>

    高性能緩存設(shè)計(jì):如何解決緩存偽共享問題

    緩存行,引發(fā)無效化風(fēng)暴,使看似無關(guān)的變量操作拖慢整體效率。本文從緩存結(jié)構(gòu)原理出發(fā),通過實(shí)驗(yàn)代碼復(fù)現(xiàn)偽共享問題(耗時(shí)從3709ms優(yōu)化至473ms),解析其底層機(jī)制;同時(shí)深入剖析高性能緩存
    的頭像 發(fā)表于 07-01 15:01 ?127次閱讀
    高性能<b class='flag-5'>緩存</b>設(shè)計(jì):如何解決<b class='flag-5'>緩存</b>偽共享問題
    主站蜘蛛池模板: 久久AV喷吹AV高潮欧美 | AV无码九九久久 | 欧美 亚洲 日韩 在线综合 | 香蕉久久日日躁夜夜嗓 | 找老女人泻火对白自拍 | 黄色天堂网站 | 99国产精品久久久久久久日本竹 | 国产亚洲精品久久久久5区 国产亚洲精品久久久久 | a视频在线观看 | 丝袜诱惑qvod| 亚洲午夜精品A片久久软件 亚洲午夜精品A片久久不卡蜜桃 | 99视频网址| 国产精品一区二区三区四区五区 | 强行撕开衣服捏胸黄文 | 99久久蜜臀AV免费看蛮 | 久久国产主播福利在线 | 色就色 综合偷拍区欧美 | 99在线视频免费观看视频 | www.97干| 国产在线观看不卡 | 伊人香蕉在线播放视频免费 | 范冰冰hdxxxx | 无码AV免费精品一区二区三区 | 在线视频中文字幕 | 中文字幕乱码一区久久麻豆樱花 | 久久国产香蕉 | 色cccwww| 亚洲中文久久精品AV无码 | 好想被狂躁A片免费久99 | 国产精品久久久久久影院 | 视频一区视频二区ae86 | 三级全黄的视频在线观看 | 国产呻吟久久久久久久92 | 蜜柚在线观看免费高清官网视频 | 日本高清免费一本在线观看 | 蜜桃传媒在线播放 | 琪琪see色原网站在线观看 | WWW夜片内射视频在观看视频 | 成人免费肉动漫无遮网站 | 亚洲AV日韩AV欧美在线观看网 | 性色少妇AV蜜臀人妻无码 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品