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

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

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

引言

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

案例描述

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

原因分析

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

圖片圖片

查詢方法偽代碼

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

責任編輯:武曉燕 來源: 京東技術
相關推薦

2024-07-01 08:04:38

2018-04-05 23:29:35

2025-02-10 09:22:40

2025-04-07 09:31:05

2010-10-22 15:45:49

無線互聯

2025-01-14 09:19:47

2023-10-04 07:38:20

架構架構設計領域

2015-08-27 10:11:18

2021-09-03 14:00:52

端點安全漏洞網絡安全

2022-04-12 14:54:52

Rediskey

2024-05-29 12:47:27

2025-03-07 08:17:36

2019-03-22 13:46:13

公共云云計算云端

2012-12-03 10:44:00

開源

2011-05-10 11:10:21

思科精簡運營模式

2025-03-21 11:30:59

2010-12-24 11:53:16

2024-06-19 15:32:07

2025-05-21 10:10:00

C++內存泄漏開發

2022-03-09 20:18:49

TypeScript類型函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草精品视频 | 亚洲在线中文字幕 | 在线国产一区二区三区 | 国产精品日韩欧美一区二区三区 | 99国产精品久久久久 | 亚洲欧美综合网 | 亚洲成人av在线播放 | 久久精品国产99国产 | 国产精品久久久久影院色老大 | 一区二区三区在线播放视频 | 亚洲性人人天天夜夜摸 | 欧美一级精品片在线看 | 欧美三级三级三级爽爽爽 | 完全免费av在线 | 一区二区三区不卡视频 | 久久国产欧美日韩精品 | 一区二区日本 | 日本免费一区二区三区视频 | 日韩一区二区三区在线观看 | 日韩1区| 亚洲国产精品久久久 | 中文字幕第一页在线 | 99九九视频 | 精品国产一区二区三区日日嗨 | 亚洲成人一区 | 国产精品久久久久久久久久免费看 | av免费在线观看网站 | 91手机精品视频 | 一级毛片免费看 | 欧美中文字幕在线 | 亚洲一二三区精品 | 三级高清| 午夜不卡福利视频 | 午夜精品一区二区三区三上悠亚 | www,黄色,com | 久草青青草| 久久久精品影院 | 欧洲一级黄 | 国产精品不卡一区 | 国产一区二区三区在线 | 久久欧美精品 |