1、Redis雪崩怎么處理?
案例場景:目前電商熱點數(shù)據(jù)都會去做緩存 ,一般緩存都是定時任務去刷新,或者是查不到之后去更新的,定時任務刷新就有一個問題。假設(shè)所有熱點數(shù)據(jù)的Key都是0點失效,0點刷新的,剛好我在零點有個秒殺活動有大量用戶涌入,假設(shè)當時每秒 10000 個請求,本來緩存在可以扛住每秒 5000 個請求,但是0點時所有的Key都失效了。此時 1 秒 10000?個請求全部到了數(shù)據(jù)庫,數(shù)據(jù)庫必然扛不住就直接掛了。這個時候重啟數(shù)據(jù)庫,又會新的流量給搞掛。這就是我理解的緩存雪崩。
處理方案:在批量往Redis存數(shù)據(jù)的時候,把每個Key的失效時間都加個隨機值,這樣可以保證數(shù)據(jù)不會在同一時間大面積失效。
如果Redis是集群部署,將熱點數(shù)據(jù)均勻分布在不同的Redis庫中也能避免全部失效的問題。或者設(shè)置熱點數(shù)據(jù)永遠不過期,有更新操作就更新緩存就好了
2、緩存穿透和擊穿與雪崩的區(qū)別?
緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求。例如我們數(shù)據(jù)庫的 id 都是1開始自增上去的,如發(fā)起id值為 -1 的數(shù)據(jù)請求。每次請求都能繞開Redis直接到數(shù)據(jù)庫,但是數(shù)據(jù)庫也查不到,如果同一時間大量這樣的請求會導致數(shù)據(jù)庫壓力過大,嚴重會擊垮數(shù)據(jù)庫。
緩存雪崩是因為緩存中的數(shù)據(jù)同一時間大面積失效造成大量請求直接到了數(shù)據(jù)庫造成數(shù)據(jù)庫崩潰,而緩存擊穿是指一個Key非常熱點,大量的請求對一個點進行訪問時造成數(shù)據(jù)庫崩潰。
處理方案:
方案一:可以把不存在的key也設(shè)置緩存,并設(shè)置過期時間;
解決思路,盡量的把請求攔截到,不讓它去訪問數(shù)據(jù)庫,那我們怎么去攔截呢,比如說,當拿一個不存在key訪問程序的時候,如果查詢數(shù)據(jù)庫,不存在對應的值,那我們也會給不存在的這個key 存入到緩存里面,并且可以設(shè)置緩存失效時間;比如說可以把對應的key設(shè)置為null值存入到緩存里面,如果下次有相同的key來訪問的時候,在緩存失效之前,都是直接從緩存里面??;這樣就會把不必要的請求攔截下來;
方案二:使用redis或者zookeep提供的互斥鎖也可以解決緩存擊穿
這種方案是通過異步方式 去獲取緩存過程中,其他key 處于等待現(xiàn)象,必須等待第一個構(gòu)建完緩存之后,釋放鎖,其他人才能通過該key才能訪問數(shù)據(jù)