Redis与MySQL双写一致性

发布时间 2023-07-20 22:03:30作者: pf666nb

Redis与MySQL双写一致性

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

  1. 强一致性 系统写入什么,读出来也会是
  2. 弱一致性 写入成功之后,不承诺立即可以读到写入的值,也不承诺多久之后能够达到一直,但是会尽可能地保证某个时间级别
  3. 最终一致性 最终一致性是弱一致性的一个特例,系统会保证在一定的时间内能够达到一个数据一致状态,是业界比较推崇的模式之一

三个经典的缓存模式

缓存可以提升性能,缓解数据库压力,但是使用缓存也会导致数据不一致的问题,一般我们是如何使用缓存呢?有三种经典的缓存模式:

  1. Cache-Aside Pattern
  2. Read-Through/Write through
  3. Write behind

Cache-Aside Pattern

Cache-Aside Pattern,即旁路缓存模式,它的提出是为了尽可能的解决缓存与数据库不一致问题。Cache-Aside读流程

  1. 读的时候,先读缓存,缓存命中的话,直接返回数据,
  2. 缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应。

Cache-Aside 写流程

  1. 更新的时候,先更新数据库,然后再删除缓存,

Read-Through/Write-Through 读写穿透

Read/Write Through 模式中服务端把缓存作为主要数据。应用程序跟数据库缓存交互,都是通过抽象缓存层完成的。

Read-Through

  1. 从缓存读取数据,读到直接返回
  2. 如果读取不到,从数据库加载,写入缓存

Write-Through模式下,当发生写请求时,也是由缓存抽象层完成数据源和缓存数据的更新,流程如下

Write behind (异步缓存写入)

Write behind跟Read-Through/Write-Through有相似的地方,都是由Cache Provider来负责缓存和数据库的读写。它两又有个很大的不同:Read/Write Through是同步更新缓存和数据的,Write Behind则是只更新缓存,不直接更新数据库,通过批量异步的方式来更新数据库。
这种方式下,缓存和数据库的一致性不强,对一致性要求高的系统要谨慎使用。但是它适合频繁写的场景,MySQL的InnoDB Buffer Pool机制就使用到这种模式。