从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。 缓存一致性设计方案主要有两种模式,一种是双写模式,一种是失效模式
一:双写模式
二:失效模式
其中双写模式和失效模式又可以根据数据库和缓存的顺序性分成下面三种情况
1)先更新数据库,再更新缓存
2)先删除缓存,再更新数据库
3)先更新数据库,再删除缓存
三:最终解决办法
对于大部分缓存场景来说,采用3方案就都可以满足需求(至多加上4),缓存的出现就是为了提高程序的性能,如果追求强一致性,就没太大必要使用缓存,即对于缓存时效性要求特别高的场景,倒还不如直接把数据存到数据库中,我们使用缓存,只要保证最终一致性即可,强一致性实现起来很复杂,即使实现了,对性能的影响,对程序的设计也违背了缓存的初衷。
附:canal常用使用场景,后续会研究使用canal从mysql备份数据到elasticSearch