产生问题的场景

写入数据库后立即更新缓存(较常见)

redis双写一致问题场景及方案-LMLPHP
这种场景下 问题产生的主要原因是写入数据库与更新缓存非原子性 有延迟 所以这样会导致谁更新缓存慢 谁会真正的更新缓存

更新数据库后立即删除缓存 查询时再插入缓存

redis双写一致问题场景及方案-LMLPHP
与上一场景类似 虽然写入数据库后删除了缓存 但由于查数据库和更新缓存之间存在延时 所以还是不能真正的更新缓存

解决方案

最简单的方案

对可能出现上述情况的缓存加过期时间,在低概率的情况下 虽没有完全解决这个问题 但是大概率只是短时间某几个key存在上述问题 看系统的容忍度

加读写锁

对于读读 情况不需要枷锁 但对于并发读写/写读 /写写要加锁

引入canal

canal既监听mysql的binlog 一般都会用kafka解耦 同时保证了顺序性
缺点:增加了系统的复杂度

延时双删

redis双写一致问题场景及方案-LMLPHP
写缓存后立即删除缓存后等待一段时间后再次删除缓存 目的是防止其他线程更新缓存 如上图中的线程3 这种情况
缺点:1.不能完全解决 因为线程3更新缓存的时间可能还是会晚于第二次删除缓存的时间 只能说更大程度的避免了这一问题发生的可能性
2.等待时间不好掌握

04-17 09:19