redis
数据库中如何与redis缓存保持双写一致性呢?
❒ 双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致 ✅方案一(延时双删): 读操作:缓存命中,直接返回。缓存未命中查询数据库,写入缓存,设定超时时间。 写操作:延迟双删(删除缓存 → 更新数据库 → 删除缓存) ✅方案二: 加互斥锁,能够保证数据强一致性,缺点是性能低 ✅方案三: 加读写锁,读的时候加共享锁,写的时候加排他锁 ✅方案四: 消息中间件异步通知,保证数据最终一致 ✅方案五: 基于canal异步通知,保证数据最终一致(代码0入侵) 修改数据库 → 写入数据库 → canal监听mysql的binlog → 通知数据变更情况 → 更新缓存信息
✅允许延时一致的业务,采用异步通知 使用消息中间件,更新数据之后,通知缓存删除 利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binog数据更新缓存 ✅强一致性的,采用Redisson提供的读写锁 共享锁:读锁readLock,加锁之后,其他线程可以共享读操作 排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作