Redis什么是熱Key問題以及如何解決熱Key問題
一、什么是熱Key?
在Redis中,我們把訪問頻率高的Key,稱為熱Key。
比如突然又幾十萬(wàn)的請(qǐng)求去訪問redis中某個(gè)特定的Key,那么這樣會(huì)造成redis服務(wù)器短時(shí)間流量過于集中,很可能導(dǎo)致redis的服務(wù)器宕機(jī)。
那么接下來(lái)對(duì)這個(gè)Key的請(qǐng)求,都會(huì)直接請(qǐng)求到我們的后端數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)性能本來(lái)就不高,這樣就可能直接壓垮數(shù)據(jù)庫(kù),進(jìn)而導(dǎo)致后端服務(wù)不可用。
二、熱Key產(chǎn)生的原因?
1、用戶消費(fèi)的數(shù)據(jù)遠(yuǎn)大于生產(chǎn)的數(shù)據(jù),如商品秒殺、熱點(diǎn)新聞、熱點(diǎn)評(píng)論等讀多寫少的場(chǎng)景。
雙十一秒殺商品,短時(shí)間內(nèi)某個(gè)爆款商品可能被點(diǎn)擊/購(gòu)買上百萬(wàn)次,或者某條爆炸性新聞等被大量瀏覽,此時(shí)會(huì)造成一個(gè)較大的請(qǐng)求Redis量,這種情況下就會(huì)造成熱點(diǎn)Key問題。
2、請(qǐng)求分片集中,超過單臺(tái)Redis服務(wù)器的性能極限。
在服務(wù)端讀數(shù)據(jù)進(jìn)行訪問時(shí),往往會(huì)對(duì)數(shù)據(jù)進(jìn)行分片切分,例如采用固定Hash分片,hash落入同一臺(tái)redis服務(wù)器,如果瞬間訪問量過大,超過機(jī)器瓶頸時(shí),就會(huì)導(dǎo)致熱點(diǎn) Key 問題的產(chǎn)生。
三、熱點(diǎn)Key的危害?
1、緩存擊穿,壓垮redis服務(wù)器,導(dǎo)致大量請(qǐng)求直接發(fā)往后端服務(wù),并且DB本身性能較弱,很可能進(jìn)一步導(dǎo)致后端服務(wù)雪崩。
四、如何識(shí)別熱點(diǎn)Key?
1、憑借個(gè)人經(jīng)驗(yàn),結(jié)合業(yè)務(wù)場(chǎng)景,判斷哪些是熱Key。
比如,雙十一大促的時(shí)候,蘋果手機(jī)正在秒殺,那么我們可以判斷蘋果手機(jī)這個(gè)sku就是熱Key。
2、使用redis之前,在客戶端寫程序統(tǒng)計(jì)上報(bào)。
修改我們的業(yè)務(wù)代碼,在操作redis之前,加入Key使用次數(shù)的統(tǒng)計(jì)邏輯,定時(shí)把收集到的數(shù)據(jù)上報(bào)到統(tǒng)一的服務(wù)進(jìn)行聚合計(jì)算,這樣我們就可以找到那些熱點(diǎn)Key。缺點(diǎn)就是對(duì)我們的業(yè)務(wù)代碼有一定的侵入性。
3、服務(wù)代理層上報(bào)。
這個(gè)要看具體公司redis集群架構(gòu)是怎么樣的,如果是在redis前面有一個(gè)代理層,那么我們可以在代理層進(jìn)行收集上報(bào),也是可以找到熱點(diǎn)Key。如下這種架構(gòu):
這種方式確定也很明顯, 每個(gè)公司的架構(gòu)不一樣,并非都有Proxy代理這一層。
4、使用redis自帶的命令。
例如monitor、redis-cli加上--hotkeys選項(xiàng)等,不過這種方式執(zhí)行起來(lái)很慢,可能會(huì)降低redis的處理請(qǐng)求的性能,慎用。
monitor命令:可以實(shí)時(shí)抓取出redis服務(wù)器接收到的命令,然后寫代碼統(tǒng)計(jì)出熱Key,也有現(xiàn)成的分析工具可以使用。
5、redis節(jié)點(diǎn)抓包分析。
自己寫程序監(jiān)聽端口,解析數(shù)據(jù),進(jìn)行分析。
五、如何解決熱Key問題?
1、Redis集群擴(kuò)容:增加分片副本,分?jǐn)偪蛻舳税l(fā)過來(lái)的讀請(qǐng)求;
2、使用二級(jí)緩存,即JVM本地緩存,減少Redis的讀請(qǐng)求。
例如使用Caffeine+redis 實(shí)現(xiàn)二級(jí)緩存,先從本地緩存中取,取不到再去redis中去取。當(dāng)然也可以使用其它框架,如ehcache、甚至一個(gè)HashMap都可以。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL的InnoDB存儲(chǔ)引擎的數(shù)據(jù)頁(yè)結(jié)構(gòu)詳解
這篇文章主要為大家詳細(xì)介紹了MySQL的InnoDB存儲(chǔ)引擎的數(shù)據(jù)頁(yè)結(jié)構(gòu),,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03MySQL主從搭建(多主一從)的實(shí)現(xiàn)思路與步驟
通過MySQL主從配置,可以實(shí)現(xiàn)讀寫分離減輕數(shù)據(jù)庫(kù)壓力,最近正好遇到這個(gè)功能,所以這篇文章主要給大家介紹了關(guān)于MySQL主從搭建(多主一從)的實(shí)現(xiàn)思路與步驟,需要的朋友可以參考下2021-05-05mysql學(xué)習(xí)筆記之完整的select語(yǔ)句用法實(shí)例詳解
這篇文章主要介紹了mysql學(xué)習(xí)筆記之完整的select語(yǔ)句用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql select語(yǔ)句各種常見參數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04MySQL中關(guān)于超鍵和主鍵及候選鍵的區(qū)別
這篇文章主要介紹了MySQL中關(guān)于超鍵和主鍵及候選鍵的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07ubuntu下設(shè)置mysql自動(dòng)備份的例子
ubuntu下設(shè)置mysql自動(dòng)備份的例子,供大家學(xué)習(xí)參考2013-01-01