为了保证redis和MySQL数据的一致性,我们知道要进行延时双删,具体原因分析参考Redis和MySQL保持数据一致性
简单说一下延时双删的原理:
先进行redis删除,然后写入数据库,等待一段时间后再进行redis删除
原理自不必说,问题在于在写入数据库后为什么要延迟一段时间再删除redis而不能直接删除?
事务1进行数据库写入,当有其他事务2在A时间段内进行查询操作时,因为这时候数据库还没写入,这时候事务2读到的是旧数据。如果事务1在写入数据库后直接进行redis的删除,这时候事务2在事务1最后删除redis后更新了redis,那么这样就导致了数据不一致。以后每次读取时读到的都是脏数据直到redis过期。
出问题的原因是什么,就是因为有事务2在A时间段内读取数据库时,在其他时间段内都不会发生不一致的问题。
因此我们要保证所有在A时间段内读取数据库的事务在更新redis后,事务1能够将redis删除。
只要设置延时时间为事务2的请求时间,这时候保证事务1在最后删除redis前,事务2已经更新了redis,保证了事务2的更新redis操作发生在事务1最后删除redis操作前。
事务3即增加了延迟操作,保证最后redis删除时可以将所有的事务2的redis删除,这样就保证了最终的redis和MySQL数据的一致性