緩存的目的是高性能、高併發
進程內緩存
一個帶鎖的Map或內存DB,列入leveldb
- 進程內通信,效率高,但緩存大小受限
- 每個服務實例中都緩存一份數據,緩存數據可能不一致
進程內緩存違背了分層架構無狀態原則,一般使用場景爲:數據量較少的只讀數據,允許數據不一致,極高併發下透傳後端壓力大的場景。 大部分情況應該使用緩存中間件,如redis。
緩存服務
redis基於主從讀寫分離實現高併發, 哨兵主備實現高可用
redis兩種備份方式:
- RDB
- AOF
淘汰緩存,而不是修改緩存
緩存數據可能是經過基礎數據組合計算而來的,修改基礎數據後,緩存數據可能並不會立馬訪問,也有可能修改多次基礎數據後才訪問緩存數據,所以修改緩存代價較高,應該淘汰緩存,而不是修改緩存。
Cache Aside Pattern
- 讀時先讀緩存,緩存無在讀數據庫,取出後放入緩存並返回
- 寫時先更新數據庫,後刪除緩存
Cache Aside Pathen也可能數據不一致,參考
架構師之路
緩存與數據庫不一致
緩存與數據庫不一致是有讀寫分離,主從數據不一致導致的。
主從不一致
- 忽略
- 強制讀主
- 選擇性讀主