常见的解决方案:
1. 先更新数据库后,再更新缓存
如果数据库更新成功,缓存更新失败。那么我们在缓存失效之前,读取到的一直都是老数据,而数据库里面是新数据
2. 先更新缓存,再更新数据库
如果缓存更新失败,数据库更新成功。导致我们读取到的一直都是错误的缓存值
******************以上两种方案均不可取,无法原子性,所以不要选择更新缓存的操作***************
3. 先删除缓存,再更新数据库
实际中有一定的使用量,即使更新数据库失败也没有问题,数据都是老的。
不过在高并发下会有问题,比如线程A删除缓存后,正在更新数据库时,这个时候线程B来查询缓存,发现缓存为空,就把数据库中的老数据写到缓存。导致缓存中存在的一直是老数据。
针对以上的高并发条件下的问题,我们可以采取双删的策略。先删除缓存,再更新数据库,再删除缓存。
4. 先更新数据库,再删除缓存
这种是比较流行的做法,支持高并发。这种做法的关键是要保证数据库更新完以后,缓存的删除必须保证成功。
以下两种方案可以应对缓存的删除失败:
1.消息队列补偿 删除失败的消息打入队列,监听队列,再次重试执行
2.用canal监听binlog 当mysql的数据发生变化后,canal会收到一条消息,这个时候进行删除。好处是可以代码解耦,减少业务的复杂度。并且中间件保证了我们的高可用性。
Canal:https://blog.csdn.net/wt334502157/article/details/119763273