Java基础教程专栏保证了缓存和数据库的双写一致性
公主,请抬起你的头,否则王冠会掉下来。
分布式缓存是许多分布式应用程序中必不可少的组件,但是当使用分布式缓存时,它可能涉及到缓存和数据库的双重存储和双重写入。只要是双写,就会出现数据一致性问题。一致性问题怎么解决?
缓存备用模式
缓存+数据库读写最经典的模式是缓存备用模式。读取时,请先读取缓存。如果缓存不可用,读取数据库,然后取出数据放入缓存,并返回响应。
更新时,请先更新数据库,然后删除缓存。
为什么要删除缓存而不是更新?
原因很简单。在许多情况下,在复杂点的缓存场景中,缓存不仅仅是直接从数据库中获取的值。
例如,某个表的一个字段可能被更新,然后相应的缓存需要查询其他两个表的数据并执行操作来计算最新的缓存值。
此外,更新缓存的成本有时非常高。是否意味着每次修改数据库,都必须更新对应的缓存?也许有些场景是这样的,但对于更复杂的缓存数据计算场景却不是这样。如果经常修改缓存中的多个表,缓存也会经常更新。但问题是,这个缓存会被频繁访问吗?
比如栗子,缓存中涉及的一个表的字段在1分钟内被修改20次或者100次,那么缓存被更新20次和100次;但是这个缓存一分钟只读取一次,而且有很多冷数据。实际上,如果只是删除缓存,1分钟内缓存只会重新计算一次,开销会大大降低,所以会用缓存来计算缓存。
实际上,删除缓存,而不是更新缓存,是一种懒惰的计算思想。不要每次都重新计算,