造成这个问题的原因
首先这两个操作不是原子性的,在多线程环境下,当线程A从数据库中读到的数据是1,在往缓存里面更新缓存之前,线程B操作了这条数据更新成为2。并发带来的原子性问题就是出现这个问题的根本原因。
解决方案
- 强一致性
- 延时双删:删除数据、更新redis的时候,等待其他线程把缓存更新好。可能出现新的问题就是不知道等待多久、不知道其他线程是否处理完毕。还需要他在代码里面写一些延时方案。
- 锁:把这两个操作变成原子性。性能就会有影响,违背用缓存的初衷。
如果真的有强一致性要求,就不用缓存。
最终一致性
-
缓存加过期时间
-
利用中间件
canal
消息中间件的可靠通信