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

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


咨詢
建站咨詢
