这个问题如果问道先删或者先更新谁也不好使,高并发情况肯定会不一致。
1 产生数据不一致的各种情况
1.1 先写在更新
1.2 先写完后删除对应的缓存
优化版1:缓存双删
优化版2:串行化队列
2 高并发解决方案
2.1 设置缓存过期时间
redis.expire(key, 3) + update + redis.del(key), 这样就算更新后不能删除数据, 更新前设置的那个短暂的过期时间也会让数据过期清除.
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。
所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。
该方案的弊端
结合双删策略+缓存超时设置,这样最差的情况,就是在超时时间内,数据存在不一致,而且又增加了写请求的耗时。
2.2 使用canal进行同步
java利用canal监听数据库
https://blog.csdn.net/ZGL_cyy/article/details/116563680
大数据同步工具Canal
https://blog.csdn.net/ZGL_cyy/article/details/114799026
这个基本是准实时更新的,相当于mysql的主从一样