
1) 【一句话结论】在WMS中设计缓存策略需结合业务场景,采用“本地缓存+分布式缓存”分层,高频读用本地缓存提升性能,分布式缓存解决跨服务共享;更新策略上,读多写少场景用写时复制减少锁竞争,需保证数据最终一致性,双写策略需考虑失败处理,避免脏数据。
2) 【原理/概念讲解】缓存的核心是“缓存-数据库”的读写分离,目的是减少数据库压力,提升系统响应速度。
ConcurrentHashMap),适用于高频读、数据不常变的情况(如库存数量、商品信息),因为读操作远多于写操作,本地缓存能快速响应。3) 【对比与适用场景】
| 类别 | 本地缓存 | 分布式缓存(如Redis) |
|---|---|---|
| 定义 | 应用进程内内存存储的缓存,数据仅该进程可见 | 跨进程/机器的共享缓存,数据由Redis等存储 |
| 特性 | 读写速度快(进程内访问),无需网络通信 | 需网络通信,但可共享,支持高并发 |
| 使用场景 | 高频读、数据不常变(如静态商品信息、库存快照) | 跨服务共享、高并发读(如入库、出库查询)、分布式系统 |
| 注意点 | 进程重启后缓存数据丢失,需持久化或热重启 | 网络延迟、Redis故障导致数据丢失,需备份 |
| 更新策略 | 写时复制(CoW) | 双写(先缓存后数据库/先数据库后缓存) |
|---|---|---|
| 原理 | 写操作时复制旧数据,写完成后更新新数据,原数据不变 | 先更新缓存,再更新数据库(或反之),保证数据最终一致 |
| 适用场景 | 读多写少,减少锁竞争,提升并发性能 | 写操作频率不高,或需保证数据一致性(如金融场景) |
| 优点 | 减少锁竞争,读操作不受写影响 | 保证数据最终一致性 |
| 缺点 | 写操作时内存开销(复制数据),可能增加延迟 | 写操作失败导致数据不一致,需重试或补偿 |
4) 【示例】
本地缓存示例(伪代码):
public class InventoryService {
private final ConcurrentHashMap<String, Integer> localCache = new ConcurrentHashMap<>();
private final JdbcInventoryDao dao;
public InventoryService(JdbcInventoryDao dao) {
this.dao = dao;
loadInitialData();
}
private void loadInitialData() {
List<Inventory> inventories = dao.getAllInventories();
for (Inventory inv : inventories) {
localCache.put(inv.getProductId(), inv.getQuantity());
}
}
public int getQuantity(String productId) {
Integer quantity = localCache.get(productId);
if (quantity == null) {
quantity = dao.getQuantity(productId);
localCache.put(productId, quantity);
}
return quantity;
}
public void updateQuantity(String productId, int delta) {
dao.updateQuantity(productId, delta);
localCache.put(productId, localCache.getOrDefault(productId, 0) + delta);
}
}
分布式缓存(Redis)示例:
// Redis缓存:库存数量
{
"key": "inventory:product:123",
"value": 100,
"ttl": 3600 // 1小时过期
}
// 写操作(先数据库后缓存,双写)
1. 更新数据库:UPDATE inventory SET quantity = quantity + 1 WHERE product_id = 123;
2. 更新Redis:SET inventory:product:123 101 EX 3600;
// 读操作(先Redis后数据库,缓存未命中时查数据库)
1. GET inventory:product:123 -> 100
2. 若为空,查询数据库,然后SET缓存
5) 【面试口播版答案】
面试官您好,在库存管理系统(WMS)中设计缓存策略,核心是分层缓存(本地+分布式)结合更新策略,保证性能与一致性。首先,高频读场景用本地缓存(如进程内ConcurrentHashMap),快速响应,比如库存数量、商品信息,因为读多写少,本地缓存能减少数据库压力。对于跨服务共享或高并发读,用分布式缓存(如Redis),比如入库、出库查询模块都访问库存,通过Redis共享数据,避免重复查询数据库。更新策略上,读多写少用写时复制(CoW),写操作时复制旧数据,写完成后更新新数据,减少锁竞争,提升并发;如果写操作频率不高或需保证一致性,用双写(先数据库后缓存),比如库存扣减,先更新数据库,再更新Redis,保证最终一致性。总结来说,本地缓存解决高频读,分布式缓存解决跨服务共享,写时复制优化读多写少场景,双写保证一致性,需根据业务场景选择组合。
6) 【追问清单】
7) 【常见坑/雷区】