Redis篇--双写一致

68 阅读1分钟
  1. redis做为缓存,mysql的数据如何与redis进行同步呢?( 双写一致性

分两种情况进行讨论

第一种,业务需要保证强一致性

候选人:使用Redisson实现的读写锁。在读的时候添加共享锁,允许多线程并发读操作,但阻塞写操作。当我们更新数据的时候,添加排他锁。独占资源,禁止其他读写操作,这样就能保证在写数据的同时,是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是,读方法和写方法上需要使用同一把锁才行。

第二种,业务允许延迟一致(大部分业务)

候选人:采用异步通知的方法。

  • 可以使用MQ中间件,更新数据之后,通知缓存删除。
  • 利用canal中间件,不需要修改业务代码,伪装为mysql中的一个从节点,canal通过读取binlog数据更新缓存。
  1. 你听说过 延时双删 吗?为什么不用它呢?

候选人:延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据。其中,这个延时多久不太好确定。在延时的过程中,可能会出现脏数据,并不能保证强一致性,所以没有采用它。