這篇文章帶大家簡單了解Redis中的快取穿透、快取雪崩、快取擊穿和快取一致性,介紹一下快取穿透和快取雪崩的解決方案,希望對大家有幫助!
快取相同時間大面積失效,後面的請求都會落在資料庫上,造成資料庫短時間內無法承受大量請求而崩潰
例如在電商首頁,所有首頁的key失效時間都是12小時,中午12點刷新,如果零點有個秒殺活動大量用戶湧入,但是緩存當時所有key都失效,此時所有的請求會落到資料庫,資料庫扛不住,就直接就gg了,又或者redis宕機,也會讓大量請求落到mysql,造成掛機。 【相關推薦:Redis影片教學】
所以像這種情況就應該把每個key的失效時間加個隨機值,避免同一時間大量的key失效,如果是redis叢集部署,可以將熱點資料分佈到各個不同的庫。
事前:盡量保證redis叢集的高可用性,發現機器宕機盡快補上,選擇合適的記憶體淘汰策略
事中:本地ehcache快取hystrix限流加降級,避免mysql崩掉
#事後:裡面有redis持久化機制保存的資料盡快恢復快取。
大量請求的key不存在於快取中,例如某個駭客製造快取中不存在的key發起大量請求,導致大量請求落到資料庫。
首先應該要做基本的入參校驗,將不合法的參數直接攔截,例如查詢資料庫id不能小於0,校驗郵箱格式等等
如果快取和資料庫都查不到某個key的數據,就將key寫入到redis,value為null,並設定過期時間,避免下次請求落到資料庫上。
透過布隆過濾器,布隆過濾器可以非常方便的判定一個給定的數據是否存在與海量數據中.可以將所有可能存在的請求的值存到布隆過濾器,當請求過來先判斷用戶發來的請求是否存在於布隆過濾器,不存在就直接攔截。
快取擊穿指的是一個Key非常熱點,在不停的扛著大並發,大並發集中對這一個點進行訪問,當這個key失效瞬間,持續的大並發就穿破緩存,直接請求到資料庫
如果是要求強一致性,那就不能使用緩存,因為保證不了強一致性,只能保證最終一致性。
如果資料庫更新失敗,那麼資料庫的還是舊數據,redis是空,資料不會不一致,讀到空會去資料庫進行查詢,然後更新到快取。
先刪除緩存,再更新資料庫,在高並發場景下也會出現問題,例如刪除了緩存,這時還沒更新資料庫,另一個執行緒進來,發現redis是空,會去讀資料庫,然後更新到redis,而此時刪除了快取的線程接著更新資料庫,就會造成資料庫和redis資料不一致,這時候可以將更新資料的操作放到佇列當中,串列化操作,不會出現,但一般不建議這樣做,因為會降低效率。
更多程式相關知識,請造訪:程式設計入門! !
以上是聊聊Redis中的快取穿透、快取雪崩、快取擊穿和快取一致性的詳細內容。更多資訊請關注PHP中文網其他相關文章!