📚 分类
redis
🕵🏽‍♀️ 问题描述
数据库中如何与redis缓存保持双写一致性呢?
👨‍🏫 问题讲解
❒ 双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

✅方案一(延时双删):
读操作:缓存命中,直接返回。缓存未命中查询数据库,写入缓存,设定超时时间。
写操作:延迟双删(删除缓存 → 更新数据库 → 删除缓存)

✅方案二:
加互斥锁,能够保证数据强一致性,缺点是性能低

✅方案三:
加读写锁,读的时候加共享锁,写的时候加排他锁

✅方案四:
消息中间件异步通知,保证数据最终一致

✅方案五:
基于canal异步通知,保证数据最终一致(代码0入侵)
修改数据库 → 写入数据库 → canal监听mysql的binlog → 通知数据变更情况 → 更新缓存信息

🏳️‍🌈 问题总结
✅允许延时一致的业务,采用异步通知

使用消息中间件,更新数据之后,通知缓存删除
利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binog数据更新缓存

✅强一致性的,采用Redisson提供的读写锁

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
📖 问题信息
📈 浏览次数:48 | 📅 更新时间:2025-12-03 16:16:34
📦 创建信息
🏷️ ID:5 | 📅 创建时间:2024-09-23 14:18:37