为了保证redis和MySQL数据的一致性,我们知道要进行延时双删,具体原因分析参考Redis和MySQL保持数据一致性

简单说一下延时双删的原理:

先进行redis删除,然后写入数据库,等待一段时间后再进行redis删除

原理自不必说,问题在于在写入数据库后为什么要延迟一段时间再删除redis而不能直接删除?

在这里插入图片描述

事务1进行数据库写入,当有其他事务2在A时间段内进行查询操作时,因为这时候数据库还没写入,这时候事务2读到的是旧数据。如果事务1在写入数据库后直接进行redis的删除,这时候事务2在事务1最后删除redis后更新了redis,那么这样就导致了数据不一致。以后每次读取时读到的都是脏数据直到redis过期。

出问题的原因是什么,就是因为有事务2在A时间段内读取数据库时,在其他时间段内都不会发生不一致的问题。

  • 在事务1第一次删除redis前:这时候读取到的本身就是旧数据
  • 在事务1写入数据库后即B时间段,这时候读到的是新数据

因此我们要保证所有在A时间段内读取数据库的事务在更新redis后,事务1能够将redis删除。

只要设置延时时间为事务2的请求时间,这时候保证事务1在最后删除redis前,事务2已经更新了redis,保证了事务2的更新redis操作发生在事务1最后删除redis操作前。

事务3即增加了延迟操作,保证最后redis删除时可以将所有的事务2的redis删除,这样就保证了最终的redis和MySQL数据的一致性

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐