技術問答
技術文章
iT 徵才
聊天室
2025 鐵人賽
登入/註冊
問答
文章
Tag
邦友
鐵人賽
搜尋
2023 iThome 鐵人賽
0
Software Development
深入淺出設計模式 - 使用 C++
系列 第
36
篇
《補充》 — 5 Classic Caching Strategies
15th鐵人賽
softwareengineering
JC
2023-10-17 00:02:35
1751 瀏覽
分享至
Classic Caching Strategy
1. Cache Aside
在這種模式下,應用程式碼負責維護
緩存和數據庫
之間的一致性。
流程
讀取(Read): 首先查詢緩存,如果未命中(Miss),則查詢數據庫並將結果存入緩存
寫入(Write): 直接寫入數據庫,然後使緩存中的相應項目失效
優缺點
優點: 簡單,易於實現
缺點: 應用程式需要手動維護緩存和數據庫的一致性
適用場景
當數據
讀取
遠多於寫入,並且可以容忍一定程度的數據
不一致
性
例: 使用者個人資料的讀取,社交網絡的朋友列表
技術選擇
Redis、Memcached
2. Read Through
在緩存未命中時,
緩存自動
從數據庫讀取數據並填充緩存
優缺點
優點: 簡化了應用程式邏輯
缺點: 可能會導致初次讀取的延遲
適用場景
當應用程式需要簡單的緩存管理,並且希望緩存和數據庫之間的數據始終保持
一致
商品庫存信息,實時金融報價
技術選擇
Hazelcast、Oracle Coherence
3. Write Through
應用程式將寫入操作
同步
進到緩存和數據庫
流程
寫入操作首先更新緩存,然後同步更新數據庫
優缺點
優點: 確保緩存和數據庫的一致性
缺點: 寫入操作的延遲可能會增加
適用場景
高
可用性
和數據
一致性
是首要考慮因素
銀行交易,訂單處理
技術選擇
Redis、AWS DynamoDB Accelerator (DAX)
4. Write Around
寫入操作僅
直接進到數據庫
,緩存不會立即更新
流程
寫入操作直接更新數據庫,緩存中的相應項目會被失效或略過
優缺點
優點: 減少不必要的緩存更新
缺點: 可能會導致緩存未命中率增加
適用場景
當數據寫入操作不經常讀取,或者寫入操作的數據量非常大
日誌寫入,批量數據處理
技術選擇
通常是自定義解決方案
5. Write Back
寫入操作首先更新緩存,然後在後台異步更新數據庫
流程
寫入操作首先更新緩存,然後由一個後台進程異步更新數據庫
優缺點
優點: 寫入操作非常快,因為它僅涉及到緩存
缺點: 如果緩存失敗,可能會導致數據丟失
適用場景
當寫入延遲需要
最小化
,並且可以容忍一定程度的數據不一致或
數據丟失
購物車信息,即時消息
技術選擇
Redis、Hazelcast
Summary [3]
Reference
https://zhuanlan.zhihu.com/p/150740291
https://www.jyt0532.com/2018/09/23/cache-mechanism/
https://blog.bytebytego.com/p/top-caching-strategies
留言
追蹤
檢舉
上一篇
《補充》 — 30+ Golden Rules in System Design
下一篇
《進階補充》 — Linux Kernel 中的經典 C Macro
系列文
深入淺出設計模式 - 使用 C++
共
37
篇
目錄
RSS系列文
訂閱系列文
8
人訂閱
33
《軟體工程篇 - 5》 — 軟體測試方法 (Software Testing)
34
《補充》 — Design Patterns Used Across Different Layers in Distributed System
35
《補充》 — 30+ Golden Rules in System Design
36
《補充》 — 5 Classic Caching Strategies
37
《進階補充》 — Linux Kernel 中的經典 C Macro
完整目錄
熱門推薦
{{ item.subject }}
{{ item.channelVendor }}
|
{{ item.webinarstarted }}
|
{{ formatDate(item.duration) }}
直播中
立即報名
尚未有邦友留言
立即登入留言
iThome鐵人賽
參賽組數
902
組
團體組數
37
組
累計文章數
19854
篇
完賽人數
528
人
看影片追技術
看更多
{{ item.subject }}
{{ item.channelVendor }}
|
{{ formatDate(item.duration) }}
直播中
熱門tag
15th鐵人賽
16th鐵人賽
13th鐵人賽
14th鐵人賽
17th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
javascript
2018鐵人賽
python
2017鐵人賽
windows
php
c#
linux
windows server
css
react
熱門問題
Diffusion Pipeline 同時多筆請求會 index out of bounds,有無可同時處理多筆的作法?
鼎新smart erp登入系統.出現錯誤訊息.LeaderWorkCenterS初始化失敗???
不懂Modelfile的Template要怎麼寫...
dockerDesktop +vm workstation pro17 問題請教
使用Aruba 1960接上Gbic沒動作
Proxmox mirgrate 有時候會跳出 redirections(599)
全新拆封Aruba AP無法接管..
window.open參數傳遞問題
如何修復 ICMP Timestamp Request Remote Date Disclosure弱點
Why is it useful to check electricity bills online every month?
熱門回答
鼎新smart erp登入系統.出現錯誤訊息.LeaderWorkCenterS初始化失敗???
使用Aruba 1960接上Gbic沒動作
dockerDesktop +vm workstation pro17 問題請教
window.open參數傳遞問題
Diffusion Pipeline 同時多筆請求會 index out of bounds,有無可同時處理多筆的作法?
熱門文章
來自 Grafana 與 OpenTelemetry 的 Logging 最佳實踐
NVIDIA NCA-AIIO 認證介紹|NVIDIA AI 基礎架構與運維入門證照完整解析
【30 天JavaScript 實戰 】 Day 23|Vite 入門
JavaScript fetch網路請求 promise (請求) request(承諾)
【30 天JavaScript 實戰 】 Day 22 |npm scripts 與 npx
IT邦幫忙
×
標記使用者
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{ result.label }}
{{ result.account }}