Redis、Mysql双写情况下,如何保证数据一致
- 场景
- 谈谈数据一致性
- 三个经典的缓存模式
- Cache-Aside Pattern
- 读流程
- 写流程
- Read-Through/Write-Through(读写穿透)
- Write behind (异步缓存写入)
- 操作缓存的时候,删除缓存呢,还是更新缓存?
- 双写的情况下,先操作数据库还是先操作缓存?
- 参考地址
场景
在几乎所有的使用缓存和数据库的项目中,几乎都会存在这样的场景,更新数据时需要更新mysql中的表数据,同时还需要更新缓存。
但因为具体的业务场景不同,所以对mysql redis里的数据一致性的 要求等级也不一样,所以,我们先谈下对数据一致性的要求问题。
谈谈数据一致性
一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。
- 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大
- 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态
- 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型
三个经典的缓存模式
Cache-Aside Pattern
Cache-Aside Pattern,即旁路缓存模式,它的提出是为了尽可能地解决缓存与数据库的数据不一致问题。
读流程
1.读的时候,先读缓存,缓存命中的话,直接返回数据
2.缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应。
写流程
更新的时候,先更新数据库,然后再删除缓存。
Read-Through/Write-Through(读写穿透)
Write behind (异步缓存写入)
操作缓存的时候,删除缓存呢,还是更新缓存?
双写的情况下,先操作数据库还是先操作缓存?
参考地址
参考地址