先删redis,再更新mysql   流程图 最后mysql是新数据,redis是旧数据,不能保证最终一致性 先更新mysql,再删redis   流程图 最后mysql是新数据,redis是旧数据 延迟删除: 先更新mysql,然后sleep一段时间,再删除redis   流程图 sleep时间,由业务侧决定,最好是大于查询接口的耗时。   本方案有一...    
如何保证redis与mysql数据最终一致性
     保证redis与mysql数据最终一致性,有以下几种方案
   先更新redis,再更新mysql   流程图
                                           最后mysql是请求1的数据,redis是请求2的数据,不能保证最终一致性
   先更新mysql,再更新redis   流程图
                                           最后mysql是请求2的数据,redis是请求1的数据,不能保证最终一致性
   先删redis,再更新mysql   流程图
                                           最后mysql是新数据,redis是旧数据,不能保证最终一致性
   先更新mysql,再删redis   流程图
                                           最后mysql是新数据,redis是旧数据
   延迟删除: 先更新mysql,然后sleep一段时间,再删除redis   流程图
                                           sleep时间,由业务侧决定,最好是大于查询接口的耗时。   本方案有一个问题: 更新mysql后,删除redis之前,查询请求从redis查到的是旧数据,虽然可以保证最终一致性,但是查到旧数据的时间较长
   延迟双删: 先删redis,然后更新mysql,然后sleep一段时间,再删除redis。    本方案可以让用户更早查询到新数据。    
                                           
   方案六看起来是所有方案中最优的,但其实还是有问题,比如下面的情况(出现概率极低),如果确实发生了这种情况,只能等key到达过期时间自己失效,或者引入mq等中间件对删除redis失败做重试。
                                           最后,友情提示一下,这个问题是面试高频题,但是面试没法画图,很难描述清楚各种场景,可以用下面的表达方式
2022-07-07