二、爲什麼使用緩存? 緩存穿透、緩存雪崩

  • 緩存是什麼?(what)
  1. 緩存,是一種存儲數據的組件,它的作用是讓對數據的請求更快地返回。我們經常會把緩存放在內存中來存儲, 所以有人就把內存和緩存畫上了等號,這完全是外行人的見解,實際上,凡是位於速度相差較大的兩種硬件之間,用於協調兩者數據傳輸速度差異的結構,均可稱之爲緩存。
  2. 緩存就是爲了彌補存儲系統在這些複雜業務場景下的不足,其基本原理是將可能重複使用的數據放到內存中,一次生成、多次使用,避免每次使用都去訪問存儲系統。
  3. 緩存作爲一種常見的空間換時間的性能優化手段,在很多地方都有應用,

- 爲什麼使用緩存?(why)

  1. 緩存經常讀取的數據在內存中,能夠提升性能,大大加快訪問速度,例如微博、微信等系統
  2. 需要經過複雜運算的數據,可以提前計算好加載到緩存中,例如在線用戶數

- 在哪裏使用緩存 ?(where)

  1. 這裏說一下緩存的分類,分爲靜態緩存、熱點本地緩存、分佈式緩存
  2. 圖片,js、css文件,和一些靜態httml可以做靜態緩存
  3. 極端熱點數據或者緩存內容比較少是可以使用單機緩存,例如ehcache組件、HashMap,Guava Cache ,不需要跨網絡,速度極快,缺點單機容量有限
  4. 分佈式環境一般使用外部緩存,redismemcahced

- 緩存的不足

  1. 緩存比較適合讀多寫少的場景,並且數據最好帶有一定的熱點屬性,
  2. 緩存會給系統帶來一定的複雜性,並會有數據不一致的風險,要根據實際情況使用
  3. 緩存通常使用內存作爲存儲介質,但是內存並不是無限的
  4. 緩存會給運維也帶來一定的成本

- 緩存的幾個問題

  1. 緩存穿透
    1. 一般有兩種情況,一個是存在數據不存在,
    2. 如果數據確實不存在,一般業務不會大量讀取這一類數據
    3. 如果被黑客攻擊,可以簡單設置個null或者默認值,第二次就會直接走緩存了,可以是一個固定+隨機過期時間
    4. 二是緩存生成需要你耗費大量時間或者資源
      1. 如果業務系統訪問時正好失效了,就會花費大量時間,拖累數據庫,
      2. 例如商品分頁數據,一般比較大,用戶一般範文前幾頁,我們一般設置1天過期時間,第10頁緩存過期概率比較大,如果有爬蟲訪問,就會導致重新生成緩存,導致拖慢數據庫,一般沒有太好的辦法,可以監控後禁止,識別爬蟲然後禁止訪問
  2. 緩存雪崩
    1. 一般是當業務系統緩存失效過期後需要重新生成緩存的過程中需要耗時幾百ms,這時候有大量的請求穿透緩存來到db,每個線程看不到其他線程緩存,會重新生成緩存,對db造成巨大的壓力,
    2. 解決方案
      1. 更新鎖:對緩存的更新進行加鎖操作,確保只有一個線程能夠更新緩存,爲獲取到鎖的線程等待或者直接返回默認值,
      2. 後臺更新機制:
        1. 由後臺系統定時,更新緩存,不是業務系統,緩存本身有效期甚至爲永久
        2. 解決當內存不夠,會剔除一些數據,可以使用消息隊列發送一條消息通知後臺系統更新緩存,更新前判斷緩存是否存在,
        3. 後臺更新還可以進行緩存預熱
  3. 緩存熱點
    1. 對於一份緩存,如果是熱點數據,經常訪問,可能單機承受不來太高的qps,可以利用副本和片機制,,把同一份數據變成多個副本,放在不同的機器上,利用key+編號區分,訪問時隨機訪問一個,要注意key不能設置統一個過期時間,否則緩存同時失效會引發上文雪崩問題
    2. 至於怎麼保證緩存中有500M數據都是熱點數據,可以利用lru機制實現,具體方案:二、如何使redis中存放的都是熱點數據?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章