? 答案是:通常每個服務實例都會獨立地緩存它自己訪問過的數據,這些數據可能是相同的,也可能是不同的,取決于請求的內容。
📌 舉個例子說明
假設你有一個商品詳情頁的服務,部署了 3 個服務實例(A、B、C),分別運行在三臺服務器上。
場景1:用戶請求同一個商品(比如商品ID=1001)
- 用戶1訪問商品1001,請求被負載均衡器分配給服務實例 A。
- 實例 A 緩存了
product:1001
的數據。 - 用戶2也訪問商品1001,請求被分配給服務實例 B。
- 實例 B 發現本地沒有這個緩存,于是去數據庫或遠程緩存中加載,并緩存一份。
- 用戶3也訪問商品1001,請求被分配給服務實例 C,同樣也會緩存一份。
? 此時:
- 每個服務實例都緩存了相同的 key:
product:1001
- 數據可能相同,但它們是相互獨立的,存在于不同機器的內存中。
場景2:不同用戶訪問不同商品
- 用戶1訪問商品1001 → 實例 A 緩存
product:1001
- 用戶2訪問商品1002 → 實例 B 緩存
product:1002
- 用戶3訪問商品1003 → 實例 C 緩存
product:1003
? 此時:
- 每個實例緩存的是不同的數據
- 它們之間不共享緩存內容
🔍 所以總結一下:
問題 | 回答 |
---|---|
三個服務實例的本地緩存是不是一模一樣的? | 不一定,取決于請求的數據是否相同 |
是不是每個節點只存一部分數據? | 不是刻意分片,而是“誰訪問誰緩存”,所以看起來像“分散”了 |
這種結構叫什么? | 非中心化緩存 / 分布式本地緩存 |
💡 本地緩存 vs 分布式緩存對比(再強化理解)
特性 | 本地緩存(Local Cache) | 分布式緩存(如 Redis) |
---|---|---|
存儲位置 | 應用進程內存內 | 集中在遠程服務器 |
數據一致性 | 各節點緩存可能不一致 | 所有節點看到的是同一份數據 |
訪問速度 | 極快(無網絡開銷) | 較慢(需網絡通信) |
可擴展性 | 不適合大規模緩存 | 支持水平擴展 |
是否共享 | 否 | 是 |
🎯 如果想解決本地緩存不一致的問題,可以考慮:
-
引入消息通知機制(如 Kafka、Redis Pub/Sub)
當某個數據更新后,通過廣播方式通知所有服務實例刪除對應緩存。 -
使用 TTL(過期時間)策略
即使緩存不一致,也可以讓緩存自動刷新。 -
結合分布式緩存 + 本地緩存的二級緩存架構
- 先查本地緩存
- 本地沒命中再去查分布式緩存
- 更新時同時清除本地和遠程緩存