Redis缓存与Mysql数据库的一致性问题解决


这个问题如果问道先删或者先更新谁也不好使,高并发情况肯定会不一致。

1 产生数据不一致的各种情况

1.1 先写在更新

1.2 先写完后删除对应的缓存

优化版1:缓存双删

优化版2:串行化队列

 2 高并发解决方案

2.1 设置缓存过期时间

redis.expire(key, 3) + update + redis.del(key), 这样就算更新后不能删除数据, 更新前设置的那个短暂的过期时间也会让数据过期清除.

从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。

所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

该方案的弊端

结合双删策略+缓存超时设置,这样最差的情况,就是在超时时间内,数据存在不一致,而且又增加了写请求的耗时。

2.2 使用canal进行同步

这个基本是准实时更新的,相当于mysql的主从一样

经验分享 程序员 微信小程序 职场和发展