- 双写一致性
一.什么是双写一致性?
在数据库中的数据修改后,也要修改缓存中的数据,保证数据库与缓存中保存的数据一致。
二.如何保证双写一致性?
回答该问题一定要结合自己的项目,说明自己的项目是必须强一致性还是允许延迟一致。
针对必须强一致性的项目:
方案一.延迟双删
1.实施:依次执行操作:删除缓存——修改数据库——延时——删除缓存
2.为什么要两次删除缓存:
(1)第一次删除缓存是因为:修改数据库中的数据后,缓存中保存的相当于过期数据,所以删除。
(2)第二次删除是因为:假设线程1删除了缓存中的数据,但还未修改数据库中的数据;此时线程2得到了时间片去查询已经被删除的数据,由于缓存中的数据已经被删除,线程2会进行缓存重建,把数据库中的数据又重新写入缓存;当线程1重新获得时间片修改完数据库后,就会出现数据库与缓存中的数据不一致的情况,因此还需要再删除一次缓存。
3.为什么要延时:
通常情况下数据库采用主从模式,延时是为了等待数据库将数据从主节点同步到从节点。
方案二.分布式锁
1.使用两把锁:
(1)共享锁:又叫读锁readlock,加锁之后,其他线程可以共享读操作,但不能进行写操作。
(2)排他锁:又叫独占锁writelock,加锁之后,其他线程的读写操作都被阻塞。
2.使用:在进行读操作时添加共享锁,读读不互斥,写互斥;在进行写操作时添加独占锁,读写互斥。
针对允许延迟一致的项目:
方案一.使用消息队列MQ
1.实施:进行修改数据库操作后,会发送消息给MQ;缓存服务会监听MQ,收到数据库修改操作的信息后,会更新缓存,以此来保持数据的最终一致性。
方案二.使用Canal
1.实施:进行修改数据库操作后,数据库会将该操作记录到二进制日志文件binlog中,canal会监听数据库的binlog,发现修改操作后会通知缓存服务更新缓存,以此来保持数据的最终一致性。
2.优点:对业务代码几乎零侵入。