本文最后更新于 2024-07-16,文章内容可能已经过时。

方式一 先操作缓存

延迟双删:保证数据一致性,更新数据时进来先删除一次redis缓存,执行更新数据库以后,延时后再删除一次,再次删除需要评估第二个线程过来查询再放入缓存需要的耗时

方式二 先操作数据库

先操作数据再操作缓存可以保证最终一致性,极端情况下删除失败进行删除重试操作,异步发送消息到消息队列mq中

总结

强一致性就导致性能损耗,若要强一致性,就需要保证缓存和数据库操作的原子性,加大了中间链路的压力

删除失败进行删除重试操作,不管方式一还是方式二都适用。

但是通过每次业务操作层面去进行操作耦合度太高,可以使用cannal进行解耦。

cannal作用是监听mysql binlog日志,检测到数据发生修改,可以发送一条消息到springboot应用中,然后执行对应的删除缓存操作。这样删除重试操作就得到了解耦。

当然这种解耦方式引入了新的中间件cannal,如果项目目前技术没有mq,还需要引入mq,这样引入了更多的中间件,如果其他地方没有使用,也会增大运维成本以及发生错误的机会,需要根据实际业务考虑是否需要解耦,以及是否需要保证强一致性,或允许一定时间内出现不一致的情况。