共計 1343 個字符,預計需要花費 4 分鐘才能閱讀完成。
這篇文章主要介紹“Redis 中的緩存穿透、緩存雪崩、緩存擊穿和緩存一致性怎么理解”,在日常操作中,相信很多人在 Redis 中的緩存穿透、緩存雪崩、緩存擊穿和緩存一致性怎么理解問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis 中的緩存穿透、緩存雪崩、緩存擊穿和緩存一致性怎么理解”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
緩存雪崩
緩存同一時間大面積失效,后面的請求都會落到數據庫上,造成數據庫短時間內無法承受大量請求而崩潰
例如在電商首頁,所有首頁的 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 中的緩存穿透、緩存雪崩、緩存擊穿和緩存一致性怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!