什麼是緩存擊穿?java
咱們先來看一段經典的代碼,關於緩存使用的數據庫
查詢先從緩存裏面獲取,緩存若是沒有,那麼再從數據庫查詢,而且寫入緩存。緩存
注意:在實際開發中,咱們通常在緩存中,存儲的數據結構是JSON字符串。數據結構
那麼 就會有一個問題,假如從數據查詢須要1秒時間app
那麼這1秒內請求都會直接到db,緩存被擊穿,若是請求特別大的時候,可能數據庫就會掛掉。ide
那應該那麼解決? 咱們通常採用,同步+雙重檢查的方式 優化
請看代碼spa
當第一次從緩存獲取失敗,咱們就同步blog
當緩存失效之後開發
第二次進來以及後面的請求,都會從緩存裏面獲取
而第一次請求進來的請求會直接查詢數據庫會放入緩存中。
優化總結:
思考1 在實際開發中,其實緩存的邏輯是差很少,只是獲取數據的方式不同?想一想能不能抽象下?
這裏我作個代碼演示
實際調用的時候
List<Content> contents = contentServImp.getData("cache" + cateId, 20L, new CacheLoader<List<Content>>() { @Override public List<Content> getData() { List<Content> contents = contentMapper.selectByExample(null); return contents; } });