在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

京東云 ? 來源:jf_75140285 ? 2025-01-24 15:39 ? 次閱讀

作者:京東零售 曹志飛

引言

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

案例描述

某系統在雙十一大促期間,遇到了一個嚴重的線上事故。業務人員在創建一個大型活動,該大型活動由于活動條件和活動獎勵比較多,導致生成的緩存內容非常大。活動上線后,系統就開始出現各種異常告警,核心UMP監控可用率由100%持續下降到20%,系統訪問Redis的調用次數和查詢性能也斷崖式下降,后續更是產生連鎖反應影響了其他多個核心接口的可用率,導致整個系統服務不可用。

原因分析

在這個系統中,為了提高查詢活動的性能,我們開發團隊決定使用Redis作為緩存系統。將每個活動信息作為一個key-value存儲在Redis中。由于業務需要,有時候業務運營人員也會創建一個非常龐大的活動,來支撐雙十一期間的各種玩法。針對這種龐大的活動,我們開發團隊也提前預料到了可能會出現的大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;

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

解決方案

為了解決這個問題,我們開發團隊采取了以下措施:

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

治理后業務偽代碼如下:

ActivityCache present = activityLocalCache.get(activityDetailCacheKey, key -> getCacheFromRedis(key));
if (present != null) {                
    return present;
}
         
/**
* 查詢二進制緩存
*
* @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;
[]>

預防措施

為了避免類似的問題再次發生,開發團隊采取了以下預防措施:

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

結論

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 軟件
    +關注

    關注

    69

    文章

    5119

    瀏覽量

    88945
  • 緩存
    +關注

    關注

    1

    文章

    245

    瀏覽量

    27041
  • key
    key
    +關注

    關注

    0

    文章

    53

    瀏覽量

    13029
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    LRU緩存模塊最佳實踐

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

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

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

    基于javaPoet的緩存key優化實踐

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

    開關電源的設計方法解析

    開關電源的設計方法解析
    發表于 08-06 14:14

    避開無源元件的陷阱

    避開無源元件的陷阱如果選錯無源元件,再好的運算放大器或數據轉換器也可能會表現不佳本文說明需要注意的一些基本陷阱
    發表于 07-29 17:11

    緩存的作用和設計模式

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

    設計/布局的關鍵測試陷阱-Design/Layout Pit

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

    緩存服務器運作的原理解析

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

    如何設計一個緩存系統?

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

    《C陷阱與缺陷》pdf

    《C陷阱與缺陷》pdf
    發表于 02-14 11:02 ?0次下載

    緩存被穿透了如何解決

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

    proteus+key+C51源碼解析

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

    聊聊緩存擊穿的解決方法

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

    MOS管選型十大陷阱:參數誤讀引發的血淚教訓MDD

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

    整流橋選型十大陷阱:MDD從電流諧波到散熱設計的實戰解析

    在工業電源設計中,整流橋選型失誤可能引發災難性后果。某光伏逆變器項目因忽略反向恢復電荷(Qrr)導致整機效率下降8%,直接損失超百萬元。本文結合MDD(模塊化設計方法),深度解析整流橋選型中的十大
    的頭像 發表于 03-10 10:41 ?383次閱讀
    整流橋選型十大<b class='flag-5'>陷阱</b>:MDD從電流諧波到散熱設計的實戰<b class='flag-5'>解析</b>
    主站蜘蛛池模板: 久操视频在线观看 | 日本不卡视频在线视频观看 | 中文字幕在线二区 | 成人在线网站 | 国产精品久久精品牛牛影视 | 人人干人人干 | 欧美xx网站 | 色噜噜狠狠色综合欧洲 | 色综合天| 国产又黄又爽又猛的免费视频播放 | 国产精品久久久久久久久kt | 亚洲国产精品国产自在在线 | 日本在线视 | 五月婷婷在线视频 | 男男宿舍高h炒肉bl 男男污肉高h坐便器调教 | 久久精品男人的天堂 | 222网站高清免费观看 | 成人xxxxx| 亚洲成av人影片在线观看 | 精品国产三级a∨在线 | 亚洲第九页 | 久久的色偷偷 | 精品欧美激情在线看 | 国产精品久久久久久久久免费hd | 天天摸天天看天天做天天爽 | 久久奇米 | 日本免费一区二区老鸭窝 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片毛片 | 色天天综合色天天看 | 国产成人经典三级在线观看 | 欧美人与z0xxxx另类 | 99se亚洲综合色区 | 看黄视频网站 | 手机天堂网 | 宅男午夜视频在线观看 | 久久观看午夜精品 | 免费高清成人啪啪网站 | 一个人看aaaa免费中文 | 亚洲最大成人网色 | 7777奇米 | 久久本道综合色狠狠五月 |