原则:以数据库的数据为标准。
分为实时一致性和最终一致性。
- 缓存使用场景
- 更新或者删除数据时
- 先操作redis还是先操作数据库
- 更新redis数据,是直接更新还是直接删除? 正常是直接删除del
- 方案1:先更新数据库,再删除缓存
正常情况:全部成功或者第一步失败
异常情况:删除redis失败,Redis旧数据
解决方案:重试,再删除。可以将删除Redis失败的数据放入mq中,让mq再去删除一次,但是这样中的风险是增加了代码入侵性,不同业务增加不同的队列。也可以解析mysql bonlog日志,确认这个是更新操作,在做redis的del操作。
- 方案2:先删除redis,再更新数据库
正常情况:全部成功或者第一步失败
异常情况:删除redis成功,更新数据库失败
解决方案:在并发场景中存在ABA的问题。可以是用延时双删的方式。
redis.delKey(123);
update.key(data);
Threep.sleep(100);
redis.delKey(123);