Redis 和Mysql的数据一致性问题| 青训营笔记

164 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

项目中遇到了Redis和Mysql的数据一致性问题,在这里记录一下问题是什么和找一下对应的解决方案。

数据一致性问题

在高并发条件下,请求的产生不是顺序完成的,如果存在redis和db同时存在的时候,如何更新对应的数据和缓存,使不产生“脏读”等问题就是数据一致性需要关注的。

导致数据不一致的原因

  1. 高并发下,要访问数据库→不能直接访问mysql(效率不够)→加入redis作为缓存
  2. 全是高并发读取:(一般问题不大)直接阅读缓存数据
  3. 全是高并发写入:出现顺序问题
  4. 高并发读写混合:容易出现数据一致性问题

所以出现一致性问题基本都是在读写混合的情况下出现的问题

一致性分类

一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。

  • 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大
  • 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态
  • 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型

一致性解决方案:

以集中式redis缓存的形式为例子: 可采用有三种经典的缓存模式:

  • Cache-Aside Pattern
  • Read-Through/Write through
  • Write behind

Cache-Aside Pattern

经典缓存+读写方案

  1. 读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应
  2. 更新的时候,先删除缓存,然后再更新数据库(缓存和数据库双写)

重点是先删除缓存,在更新数据库