Redis作为缓存使用时,主要面临以下几种数据不一致场景: 1. 缓存与数据库不一致 2. 缓存穿透、雪崩和击穿问题 3. 多级缓存间不一致 4. 分布式环境下缓存同步问题
Cache Aside Pattern (旁路缓存模式) - 读流程:先读缓存 → 缓存未命中则读DB → 写入缓存 - 写流程:先更新DB → 再删除缓存 - 优势:简单可靠,适合读多写少场景 - 注意:可能存在短暂不一致(可通过延迟双删优化)
Write Through (直写模式) - 所有写操作同时更新缓存和数据库 - 优势:强一致性保证 - 缺点:性能开销大
Write Behind (异步回写) - 先更新缓存 → 异步批量更新DB - 优势:高性能 - 风险:数据丢失可能性
public void updateData(Data data) {
// 第一次删除
redis.del(data.getId());
// 更新数据库
db.update(data);
// 延迟一定时间后再次删除
executor.schedule(() -> {
redis.del(data.getId());
}, delay, TimeUnit.MILLISECONDS);
}
[应用] → [MQ] → [消费者] → [DB]
↘ [消费者] → [Redis]
public Data getData(String id) {
Data data = redis.get(id);
if (data == null) {
Lock lock = redisson.getLock("lock:" + id);
try {
lock.lock();
// 双重检查
data = redis.get(id);
if (data == null) {
data = db.get(id);
redis.set(id, data);
}
} finally {
lock.unlock();
}
}
return data;
}
{
"data": {...},
"version": 123,
"last_updated": "2023-07-20T10:00:00Z"
}
选择哪种方案取决于业务场景对一致性、性能和可用性的具体要求。通常需要根据实际情况组合多种策略。