-
redis做为缓存,mysql的数据如何与redis进行同步呢?( 双写一致性 )
分两种情况进行讨论
第一种,业务需要保证强一致性
候选人:使用Redisson实现的读写锁。在读的时候添加共享锁,允许多线程并发读操作,但阻塞写操作。当我们更新数据的时候,添加排他锁。独占资源,禁止其他读写操作,这样就能保证在写数据的同时,是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是,读方法和写方法上需要使用同一把锁才行。
第二种,业务允许延迟一致(大部分业务)
候选人:采用异步通知的方法。
- 可以使用MQ中间件,更新数据之后,通知缓存删除。
- 利用canal中间件,不需要修改业务代码,伪装为mysql中的一个从节点,canal通过读取binlog数据更新缓存。
-
你听说过 延时双删 吗?为什么不用它呢?
候选人:延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据。其中,这个延时多久不太好确定。在延时的过程中,可能会出现脏数据,并不能保证强一致性,所以没有采用它。