37人参与 • 2025-08-06 • Redis
下面我将详细解答redis与数据库双写一致性问题,结合故事举例说明,最后用思维导图总结核心解决方案。
核心问题:当同时更新redis缓存和数据库时,由于网络延迟、操作顺序等问题导致数据不一致。
假设电商平台有商品库存系统:
// 商品服务类 public class productservice { private db db = new mysql(); // 数据库 private cache cache = new redis(); // 缓存 }
public void updateproduct(product product) { db.update(product); // 1. 更新数据库 cache.delete(product.getid());// 2. 删除缓存 }
故事场景:
管理员修改商品价格(100→80元):
用户查询时:
优势:
风险:
并发时短暂不一致(概率低):
public void updatewithdelay(product product) { cache.delete(product.getid()); // 1. 先删缓存 db.update(product); // 2. 更新数据库 thread.sleep(500); // 3. 等待500ms cache.delete(product.getid()); // 4. 再删缓存 }
故事场景:
解决上述并发问题:
// 使用canal监听mysql binlog canal.subscribe(event -> { if (event.isupdate()) { cache.delete(event.getkey()); // 异步删除缓存 } });
故事场景:
订单系统库存变更:
public void safeupdate(product product) { lock lock = redisson.getlock("product_" + product.getid()); lock.lock(); try { db.update(product); cache.update(product); // 同时更新缓存 } finally { lock.unlock(); } }
适用场景:
金融账户余额等强一致性要求:
方案 | 一致性 | 性能 | 复杂度 | 适用场景 |
---|---|---|---|---|
先db后删缓存 | 最终 | ★★★★ | 低 | 大部分业务 |
延时双删 | 最终 | ★★★ | 中 | 高并发场景 |
监听binlog | 最终 | ★★★★ | 高 | 异构系统同步 |
分布式锁 | 强一致 | ★★ | 高 | 金融/账户系统 |
核心原则:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论