Redis緩存使用總結

  • 爲什麼使用緩存?

    主要有兩個用途:

    第一個通過緩存來直接返回數據,不需要再從數據庫取出數據(加快讀取響應)

    第二個支持高併發,在高併發環境下數據庫根本撐不住這麼多併發量,需要藉助緩存實現高併發.

  • 緩存分類?

    本地緩存: 由於在本機緩存,所以需要注意控制緩存大小,內存泄漏等問題,好處是可以直接在本地讀取(更快) ,另外還可以做容災作用,當我們依賴一個服務的數據時,我們可以將數據緩存在本地,如果服務宕機了,也可以儘可能減少影響.

    分佈式緩存: 通過數據副本,數據分片,實現大量數據的緩存功能,高可用.

  • 緩存的使用

    1. 先操作數據庫,再操作緩存(讀操作過程: 讀數據先讀緩存,讀不到的話,再讀數據庫,然後將讀到的數據緩存起來 , 寫操作之後討論)

    2. 先操作緩存,再操作數據庫(藉助緩存高效的讀寫性能,運用於秒殺架構之中)

    • 緩存的使用-寫操作一致性

    • 刪除緩存 OR 更新緩存

    推薦刪除緩存,因爲在寫數據比較多的場景下,更新完緩存之後,新的緩存沒有被讀取,可能又需要更新緩存,並且更新緩存代價有時會比較大.

    • 先更新數據庫,再刪除緩存

    基本沒有問題,就是需要考慮刪除緩存失敗的問題.

    • 先刪除緩存,再更新數據庫

    結合併發來思考,如果線程A先刪除緩存,而線程B因爲沒有讀到緩存,所以去讀數據庫數據(讀到舊數據),而線程A之後更新數據庫,但是B線程沒有讀取到A更新的數據,返回了舊的緩存.此時數據庫與緩存就不一致了.

    解決1: 將讀寫請求全放在一個隊列裏串行執行,但是這樣效率會很低.我們可以根據業務hash取模將請求分發到多個隊列,同時還可以針對多個連續的讀請求來優化,因爲連續的讀請求會重複讀取數據庫裏的數據,所以我們在讀請求入隊的時候判斷如果它前面也是讀請求,那麼就不需要入隊了,只需要輪詢它前一個讀請求是否返回緩存,讀到緩存就返回.

    解決2: 延時雙刪策略,由於線程B最後會加載舊的數據,所以我們最後可以在更新數據庫之後的1s後的舊緩存緩存.

    • 刪除緩存失敗

    1. 將要刪除的數據保存起來,保存到數據庫(本地事務表),消息隊列(Rocket),然後消費者不斷重試.
    2. 訂閱bin log日誌,然後執行重試刪除操作
  • 緩存雪崩

    緩存一時間全部或者大量失效,大量請求進入數據庫.分析緩存爲什麼會失效?

    1. 緩存發生災難性故障,這是無法避免,我們通過限流方案保護數據庫(放行部分請求,其他請求走降級邏輯),同時在本地緩存部分數據,儘量減少故障的影響.
    2. 緩存設置了過期時間,大量緩存同時過期,解決方案緩存雪崩,緩存穿透解決方案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章