快取Bigkey堅決不要用,拆分是王道

2022-10-08 20:48:13 字數 3049 閱讀 3137

背景介紹

在高併發的業務場景中,快取是必須要上的,用來扛高併發。在某個業務場景中,增加了對乙個配置資訊的快取,最開始是直接讀取db的,為了效能考慮在前面加了一層快取。

加完後很長一段時間也沒問題,db的壓力也減小了很多。不幸的是在某天的乙個時間點內,流量增加了好幾倍,rt直線上公升,介面各種超時,就這樣,乙個線上故障誕生了。

整個過程持續了1分鐘左右,監控告警稍微有點延遲,剛看完監控告警,準備介入處理時流量已經跌下來了,介面也恢復了正常。

事後,通過監控發現介面超時的原因是因為底層redis超時了,說到這可能大家都抱著懷疑的態度,redis這麼快也能超時?是的,你沒看錯,就是redis超時了。

而redis超時的原因並不是說redis效能不行,而是在同一時刻有大量的請求訪問了同乙個key,這個key快取的內容很大,導致一瞬間就把網路頻寬給占用完了,後續請求都進不來。

直接擴容是最簡單有效的方式,如果有持續的高流量造成了影響,緊急擴容是必須要走的,先解決當前問題。

等流量平穩後再考慮**層面的改造,因為頻寬也不是無限的,程式不處理好,始終是個風險點。

資料量大了,我們會分庫分表。耦合嚴重了,我們會拆新的模組或者獨立的服務。小組人多了,我們會拆分成多個組。遇到bigkey,那就是拆它拆它拆它。

假設這是你的快取內容,裡面是乙個很大的json字串,儲存的是配置資訊:

那麼可以把物件中的每個key再拆分一次,作為乙個獨立的key,這樣它的value就小了很多。不同的key會在集群中的不同節點上,也就不會出現集中訪問某個節點,頻寬不夠的場景。

當然我這邊說的是string型別,如果你的是list, set這種,其實原理是一樣的,同樣是拆分成多個小的list, key的字首或者字尾不一樣即可。

本地快取,也是應對熱點key的常用解決方案。大家想想,乙個固定的key儲存在redis中,然後儲存的內容也很大,訪問量也比較高,頻寬很容易成為瓶頸,因為要遠端訪問獲取快取內容。

如果將快取儲存在本地,那麼就可以不用遠端訪問,從而頻寬也就不會成為瓶頸。

如果用了本地快取,相信很多讀者第一想法就是一致性怎麼維護,這個無論是在實際應用中還是面試中都是乙個高頻的問題。

還是得從業務場景觸發,用快取的場景肯定就是沒有強一致性的要求,能夠容忍短暫的不一致。所以在redis快取失效或者資料有變更的時候,本地快取也需要同步清除。

一般都會採用訊息廣播的方式進行通知本地快取失效,因為服務是集群部署的,每個節點上都有乙份快取資料,所以需要廣播通知。

最後要進行bigkey的治理,梳理出來目前已有的bigkey,根據業務場景進行優化。同時在後續使用快取的場景對快取內容嚴格把關,防止出現類似的問題。

分類: 生產經驗實踐

在高併發的業務場景中,快取是必須要上的,用來扛高併發。在某個業務場景中,增加了對乙個配置資訊的快取,最開始是直接讀取db的,為了效能考慮在前面加了一層快取。

加完後很長一段時間也沒問題,db的壓力也減小了很多。不幸的是在某天的乙個時間點內,流量增加了好幾倍,rt直線上公升,介面各種超時,就這樣,乙個線上故障誕生了。

整個過程持續了1分鐘左右,監控告警稍微有點延遲,剛看完監控告警,準備介入處理時流量已經跌下來了,介面也恢復了正常。

事後,通過監控發現介面超時的原因是因為底層redis超時了,說到這可能大家都抱著懷疑的態度,redis這麼快也能超時?是的,你沒看錯,就是redis超時了。

而redis超時的原因並不是說redis效能不行,而是在同一時刻有大量的請求訪問了同乙個key,這個key快取的內容很大,導致一瞬間就把網路頻寬給占用完了,後續請求都進不來。

直接擴容是最簡單有效的方式,如果有持續的高流量造成了影響,緊急擴容是必須要走的,先解決當前問題。

等流量平穩後再考慮**層面的改造,因為頻寬也不是無限的,程式不處理好,始終是個風險點。

資料量大了,我們會分庫分表。耦合嚴重了,我們會拆新的模組或者獨立的服務。小組人多了,我們會拆分成多個組。遇到bigkey,那就是拆它拆它拆它。

假設這是你的快取內容,裡面是乙個很大的json字串,儲存的是配置資訊:

那麼可以把物件中的每個key再拆分一次,作為乙個獨立的key,這樣它的value就小了很多。不同的key會在集群中的不同節點上,也就不會出現集中訪問某個節點,頻寬不夠的場景。

當然我這邊說的是string型別,如果你的是list, set這種,其實原理是一樣的,同樣是拆分成多個小的list, key的字首或者字尾不一樣即可。

本地快取,也是應對熱點key的常用解決方案。大家想想,乙個固定的key儲存在redis中,然後儲存的內容也很大,訪問量也比較高,頻寬很容易成為瓶頸,因為要遠端訪問獲取快取內容。

如果將快取儲存在本地,那麼就可以不用遠端訪問,從而頻寬也就不會成為瓶頸。

如果用了本地快取,相信很多讀者第一想法就是一致性怎麼維護,這個無論是在實際應用中還是面試中都是乙個高頻的問題。

還是得從業務場景觸發,用快取的場景肯定就是沒有強一致性的要求,能夠容忍短暫的不一致。所以在redis快取失效或者資料有變更的時候,本地快取也需要同步清除。

一般都會採用訊息廣播的方式進行通知本地快取失效,因為服務是集群部署的,每個節點上都有乙份快取資料,所以需要廣播通知。

最後要進行bigkey的治理,梳理出來目前已有的bigkey,根據業務場景進行優化。同時在後續使用快取的場景對快取內容嚴格把關,防止出現類似的問題。

程式設計師堅決!堅決!堅決!不找外包的理由

1,背鍋俠。自己心裡默默體會 2,人種歧視。內部人員老覺得自己高高在上。就是給你雞蛋挑骨頭,完事,沒人會幫你說話。你的外包公司領導,在內部領導面前宛如舔狗,不會舔的一定不會混的太好。真正有實力的也不會在外包,或者早就轉內 3,找新工作的歧視。有的公司沒有明文規定,但是潛規則,直接pass外包候選人 ...

程式設計師職場 堅決不做青蛙

下面談談可愛的的小a與小b兩人各自的工作遭遇。小a今年28了,眼看就奔三的人了,在他23歲畢業之後,小a的生活一直處於漂泊不定的狀態,開始在大城市,小a覺得這兒壓力太大,生活節 奏太快,還不如去乙個小鎮上每天悠哉遊哉呢,於是畢業後不到1年,他就卷著鋪蓋卷離開了北京,回到了自己的家鄉,乙個邊陲小鎮,在...

二十種堅決不能混吃的食物

面對美味佳餚,你是否會想到,有些食物是不能混吃的。否則,你非但不能獲得品嚐美味的享受,反而會影響健康,甚至危及生命。專家提醒你,以下這20種食物是堅決不能混吃的。1.豬肉 菱角 肚子痛 2.牛肉 栗子 引起嘔吐 3.羊肉 西瓜 傷元氣 4.狗肉 綠豆 會中毒 5.兔肉 芹菜 脫髮 6.雞肉 芹菜 傷...