文章目錄
- 雪崩(key都過期了)
- 擊穿(大量被訪問熱點key突然過期)
- 穿透(key在redis/db都不存在)
- 總結
雪崩(key都過期了)
現象:redis若采用定時重繪(redis),某時刻秒殺的時候可能redis里所有的key都失效了,都會大量請求去請求資料庫,而資料庫馬上就掛了,重啟之后又被新的流量打死了,解決:
2.1. 把每個key的失效時間設定一個隨機值,可以保證資料不會在同一時間大面積失效,
2.2. 或者設定熱點資料永不過期,有更新操作就更新快取就好了(比如更新了首頁商品,刷下快取就行了(但定期主動洗掉是隨機的吧),可以寫個腳本將新的商品新點一下,這樣記憶體就會淘汰那些很老的)
擊穿(大量被訪問熱點key突然過期)
現象:快取擊穿是指一個Key非常熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問,當這個Key在失效的瞬間,持續的大并發就穿破快取,直接請求資料庫,就像在一個完好無損的桶上鑿開了一個洞,解決:
2.1 設定熱點資料永不過期,
2.2 給訪問redis不存在->訪問mysql->寫入redis 這一整個程序加上鎖,就會保證key在一次失效之后,寫入redis程序中不會大量都來訪問資料庫,可以讓執行緒超時等待鎖,等不到的話再訪問下redis說不定這個key的資料再redis已經又存在了,
穿透(key在redis/db都不存在)
現象:快取和資料庫中都沒有的資料,用戶不斷發起請求,比如發起id=-1的資料的查詢,這時候用戶很可能很可能是黑客,這樣就會大量會查找資料庫,就又掛了,正常情況下資料庫找不到是不會放入redis中的,解決:
2.1. 對引數進行合法校驗,和對用戶進行校驗,假如一個ip在單位時間發起了大量請求就拉黑他,
2.2 在資料庫沒有取到的話,將對應的key的value寫為null,寫到redis中,不過要將這樣的key的過期時間設定短一點,畢竟黑客只是極少數的,假如redis里全是不合法的key,這不也是會造成雪崩,,
2.3 Redis還有一個高級用法布隆過濾器(Bloom Filter)這個也能很好的防止快取穿透的發生,他的原理也很簡單就是利用高效的資料結構和演算法快速判斷出你這個Key是否在Redis中存在,不存在你return就好了,存在你就去查了DB重繪KV再return,
總結
- 事前:Redis高可用,主從+哨兵,Redis cluster,避免全盤崩潰
- 事中:本地ehcache快取+Hystrix限流+降級,避免Mysql掛掉,
- 事后:Redis持久化 RDB+AOF,一旦重啟后,快速恢復Redis資料,
解釋一下限流和降級:限流組件確保了每秒只有多少個請求能通過, 只要資料庫不死,就是說,對用戶來說,3/5 的請求都是可以被處理的, 只要有 3/5 的請求可以被處理,就意味著你的系統沒死,對用戶來說,可能就是點擊幾次刷不出來頁面,但是多點幾次,就可以刷出來一次,這個在目前主流的互聯網大廠里面是最常見的,你是不是好奇,某明星爆出什么事情,你發現你去微博怎么刷都空白界面,但是有的人又直接進了,你多刷幾次也出來了,現在知道了吧,那是做了降級,犧牲部分用戶的體驗換來服務器的安全,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/197622.html
標籤:java
上一篇:QPluginLoader加載插件失敗問題(linux, windows均有效)
下一篇:生物探針技術與使用現狀
