新聞中心
java如何解決內(nèi)存緩存擊穿問(wèn)題?
第一,做好監(jiān)控,及時(shí)預(yù)警,比如當(dāng)前有多少存活的值,命中率多少等等,防止抓瞎

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)唐山,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
第二,做好主備,防止中間件單點(diǎn)故障
第三,做好緩存持久化,為什么要持久化,是防止中間件不可用,直接穿到最底層了。這個(gè)持久化并不是說(shuō)是redis自己的持久化,而是額外的
第四,就算穿庫(kù),也要保障你的執(zhí)行效率是高的,不要因?yàn)橛辛司彺婢秃雎粤俗罨A(chǔ)的部分
簡(jiǎn)要說(shuō)下緩存穿透,緩存擊穿,緩存雪崩的出現(xiàn)情景和解決方案!
出現(xiàn)上述問(wèn)題的前提:因?yàn)閿?shù)據(jù)庫(kù)使用磁盤存取數(shù)據(jù),往往比較慢,而緩存使用內(nèi)存(而且通常是key-value型),存取較快!
這樣先使用內(nèi)存緩存來(lái)緩存數(shù)據(jù)庫(kù)數(shù)據(jù),讀取數(shù)據(jù)的時(shí)候先從緩存讀取,只有獲取不到的時(shí)候才從數(shù)據(jù)庫(kù)獲??!
下面分別從概念,出現(xiàn)場(chǎng)景,解決方案來(lái)說(shuō):
①,緩存穿透
概念:訪問(wèn)一個(gè)不存在的key,所有的讀取都會(huì)訪問(wèn)數(shù)據(jù)庫(kù),通常數(shù)據(jù)庫(kù)中也沒(méi)有這樣的數(shù)據(jù),造成穿透,數(shù)據(jù)量大時(shí),導(dǎo)致數(shù)據(jù)庫(kù)卡死!
出現(xiàn)情景:一般數(shù)據(jù)庫(kù)都是使用正整數(shù)來(lái)做id,然后使用id作為key緩存,如果有人惡意攻擊,傳一個(gè)負(fù)數(shù)(-100)做大量查詢,那么數(shù)據(jù)庫(kù)崩潰!
解決辦法:
1,設(shè)置攔截,對(duì)不符合要求的id直接攔截!
海量數(shù)據(jù)下如何正確訪問(wèn)Redis服務(wù)才不會(huì)掛掉?
海量數(shù)據(jù)下正確的訪問(wèn)redis要注意的事情有很多,基本上可以從服務(wù)治理,數(shù)據(jù),redis正確使用三個(gè)方面來(lái)講。
既然是海量數(shù)據(jù),那么服務(wù)肯定要拆分成多個(gè)服務(wù),最常見(jiàn)的采用“大中臺(tái),小前臺(tái)”的概念,中臺(tái)分各個(gè)服務(wù)中心,各個(gè)中心去維護(hù)自己中心負(fù)責(zé)的服務(wù),向上游前臺(tái)提供數(shù)據(jù)和服務(wù)。比如一個(gè)做內(nèi)容付費(fèi)的公司可以有內(nèi)容中心、商品中心、交易中心
用戶中心、促銷中心、基礎(chǔ)中心、開(kāi)放平臺(tái)等,中心之間采用RPC通信或者數(shù)據(jù)共享。
在做好服務(wù)治理和數(shù)據(jù)劃分的基礎(chǔ)上,這個(gè)時(shí)候就是重點(diǎn)講如何正確使用redis的時(shí)候了,個(gè)人列舉了部分細(xì)則僅供大家參考:
熟練使用五種數(shù)據(jù)結(jié)構(gòu)(String、Set|、Hash、List、ZSet)以及每種數(shù)據(jù)結(jié)構(gòu)的適用場(chǎng)景和注意事項(xiàng);
防止緩存雪崩,即避免大批量緩存同一時(shí)間段集中過(guò)期,導(dǎo)致大量請(qǐng)求都懟到數(shù)據(jù)庫(kù)上,導(dǎo)致數(shù)據(jù)庫(kù)連接數(shù)爆滿、宕機(jī);
防止緩存穿透,避免redis中熱點(diǎn)key存入了null或者不存在,導(dǎo)致大量請(qǐng)求繞過(guò)redis請(qǐng)求數(shù)據(jù)庫(kù)去了;
避免大key的存在:比如一個(gè)redis集群是16G,共8個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)平均分配2G的內(nèi)存,這時(shí)候如果有一個(gè)大的hash key占用內(nèi)存超過(guò)2G了,這個(gè)時(shí)候盡管集群還有剩余的空間,這個(gè)大key的寫入依舊會(huì)失敗,單個(gè)key是無(wú)法做到集群的,另外再想想如果一個(gè)hash存儲(chǔ)了大量的數(shù)據(jù),考慮一下性能問(wèn)題?
禁止使用keys、flushall、flushdb等,運(yùn)維同學(xué)通過(guò)redis的rename機(jī)制禁掉命令,或者使用scan的方式漸進(jìn)式處理;
批量讀寫redis請(qǐng)采用pipeline管道的方式;
要保證Redis不會(huì)掛掉,也就是提高Redis的高可用性,可以從這么幾個(gè)方面考慮。
Redis單副本:也就是只部署一臺(tái)Redis,不需要節(jié)點(diǎn)之間的數(shù)據(jù)同步,架構(gòu)簡(jiǎn)單,部署方便;但是單臺(tái)機(jī)器畢竟是有風(fēng)險(xiǎn)的,按照題目中【海量數(shù)據(jù)】的場(chǎng)景,是不能達(dá)到高可用要求的。
Redis主從:主從實(shí)例可以部署在不同的物理服務(wù)器上,充分利用多臺(tái)服務(wù)器的資源,在主庫(kù)發(fā)生故障的時(shí)候,可以進(jìn)行主備切換,從而保證系統(tǒng)的穩(wěn)定運(yùn)行,甚至可以做到讀寫分離,主庫(kù)專門用作寫操作,一臺(tái)或多臺(tái)備庫(kù)進(jìn)行讀操作;但是當(dāng)主庫(kù)發(fā)生故障的時(shí)候(如果沒(méi)有HA方案的話),是需要手動(dòng)進(jìn)行主備切換的。
Redis Sentinel:部署架構(gòu)分為兩部分【Sentinel集群】和【數(shù)據(jù)集群】;Sentinel集群是由多個(gè)Sentinel節(jié)點(diǎn)組成的分布式集群,通常是2N+1臺(tái)服務(wù)器,可以實(shí)現(xiàn)故障發(fā)現(xiàn)和轉(zhuǎn)移、客戶端通知等功能;數(shù)據(jù)集群用于存儲(chǔ)數(shù)據(jù);它能夠解決主從模式下的自動(dòng)切換問(wèn)題,并且數(shù)據(jù)集群是可以橫向擴(kuò)展的;當(dāng)然這個(gè)架構(gòu)實(shí)現(xiàn)和部署起來(lái),也更為復(fù)雜一些;并且這個(gè)架構(gòu)不能做到讀寫分離。
Redis Cluster:Redis 3.0集群,是分布式集群解決方案之一,物理架構(gòu)中配置2N個(gè)節(jié)點(diǎn)(主從一一對(duì)應(yīng)),主節(jié)點(diǎn)提供讀寫操作,從節(jié)點(diǎn)作為備份;數(shù)據(jù)分布保存在多個(gè)節(jié)點(diǎn)上,是一種無(wú)中心的架構(gòu),如果有部分節(jié)點(diǎn)發(fā)生故障,能夠?qū)崿F(xiàn)故障自動(dòng)轉(zhuǎn)移和切換,用投票機(jī)制完成備庫(kù)升級(jí)為主庫(kù)(下文的Redis分片章節(jié),還會(huì)介紹到Redis Cluster)。
到此,以上就是小編對(duì)于redis緩存雪崩解決方案是什么意思啊的問(wèn)題就介紹到這了,希望這2點(diǎn)解答對(duì)大家有用。
新聞標(biāo)題:海量數(shù)據(jù)下如何正確訪問(wèn)Redis服務(wù)才不會(huì)掛掉?
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/dhgpecj.html


咨詢
建站咨詢
