Cache Aside Pattern緩存+數據庫讀寫模式的分析

1、Cache Aside Pattern
(1)讀的時候,先讀緩存,緩存沒有的話,那麼就讀數據庫,然後取出數據後放入緩存,同時返回響應

(2)更新的時候,先刪除緩存,然後再更新數據庫

2、爲什麼是刪除緩存,而不是更新緩存呢?
原因很簡單,很多時候,複雜點的緩存的場景,因爲緩存有的時候,不簡單是數據庫中直接取出來的值

商品詳情頁的系統,修改庫存,只是修改了某個表的某些字段,但是要真正把這個影響的最終的庫存計算出來,可能還需要從其他表查詢一些數據,然後進行一些複雜的運算,才能最終計算出

現在最新的庫存是多少,然後才能將庫存更新到緩存中去

比如可能更新了某個表的一個字段,然後其對應的緩存,是需要查詢另外兩個表的數據,並進行運算,才能計算出緩存最新的值的

更新緩存的代價是很高的

每次修改數據庫的時候,都一定要將其對應的緩存去更新一份?也許有的場景是這樣的,但是對於比較複雜的緩存數據計算的場景,就不是這樣了

如果你頻繁修改一個緩存涉及的多個表,那麼這個緩存會被頻繁的更新,頻繁的更新緩存

但是問題在於,這個緩存到底會不會被頻繁訪問到???

舉個例子,一個緩存涉及的表的字段,在1分鐘內就修改了20次,或者是100次,那麼緩存跟新20次,100次; 但是這個緩存在1分鐘內就被讀取了1次,有大量的冷數據

28法則,黃金法則,20%的數據,佔用了80%的訪問量

實際上,如果你只是刪除緩存的話,那麼1分鐘內,這個緩存不過就重新計算一次而已,開銷大幅度降低

每次數據過來,就只是刪除緩存,然後修改數據庫,如果這個緩存,在1分鐘內只是被訪問了1次,那麼只有那1次,緩存是要被重新計算的,用緩存纔去算緩存

其實刪除緩存,而不是更新緩存,就是一個lazy計算的思想,不要每次都重新做複雜的計算,不管它會不會用到,而是讓它到需要被使用的時候再重新計算

mybatis,hibernate,懶加載,思想

查詢一個部門,部門帶了一個員工的list,沒有必要說每次查詢部門,都裏面的1000個員工的數據也同時查出來啊

80%的情況,查這個部門,就只是要訪問這個部門的信息就可以了

先查部門,同時要訪問裏面的員工,那麼這個時候只有在你要訪問裏面的員工的時候,纔會去數據庫裏面查詢1000個員工

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章