双写一致性是指当修改了数据库中的数据的同时需要更新缓存数据,保持缓存和数据库数据一致性。
延时双删可以在某种程度上有效的避免缓存、数据库数据的不一致的问题,但依旧存在有脏数据风险,此方法可以大大降低产生脏数据的方向,但是无法避免产生脏数据。
如上图所示,不管是先删除缓存,在操作数据库,还是说先操作数据库,再删除缓存,都会造成读写不一致的情况。
添加分布式锁(互斥锁)、读写锁可以有效解决以上问题,
由上图可以看出,添加分布式锁后,当线程1写数据操作完成并且释放锁以后,线程2才可以开始执行,因此,这种方法有效的保证的数据的强一致性,但性能会比较低。
针对以上分布式锁出现的问题,我们可以对此进行优化,一般情况下,针对缓存中的数据都有读多写少的特点,针对此特点,我们可以通过读写锁来控制。读写锁分为共享锁和排他锁两种,其中共享锁(读锁)是指当一个线程进行加共享锁,其他线程可以进行读操作,但不能写;排他锁(独占锁)加锁后会阻塞其他线程的读和写操作。相比分布式锁,此方法在性能上有了较大的提升,同样可以保证数据的强一致性。

、

采用异步通知
使用MQ中间中间件,更新数据后,通知缓存删除。
利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存。