多级缓存和数据库之间的一致性问题

本文章是作者学习极客时间 分布式缓存 的笔记,不喜勿扰!

一个比较经典的数据库和缓存使用的模式

    读数据时,先读缓存,缓存没有的话,在读数据库,然后取出数据后放入缓存,同时返回响应。

    更新的时候,先删除缓存,在更新数据库。

   多级缓存和数据库之间的一致性问题_第1张图片

数据库缓存一致的四个方案:

方案一:

通过redis的过期时间来更新缓存,mysql 数据库更新不会触发redis 更新,只有当redis的key过期后才会重新加载

这种方案的缺点:

1、数据不一致的时间较长,会造成一定的脏数据

2、完全依赖过去时间,过期时间太短缓存更新太频繁,过长容易有太长时间更新延迟。

 

方案二:

在方案一的基础上扩展,让key 的过期时间做兜底,在更新mysql 的同时也会更新redis,

这种方案的缺点:

如果更新mysql 成功,更新redis 失败,又会成为方案一。

 

方案三:

在方案二的基础上,对redis 的更新操作进行优化,增加消息队列,转为异步更新redis 数据, 将redis 的更新操作交给MQ ,队列来保证可靠性,异步更新redis.

这种方案的缺点:

1、解决不了时序的问题,如果有多个业务实例对同一条数据进行更新,数据更新的先后顺序可能会乱。

2、引入mq ,增加的系统复杂性,增加mq的维护成本。

 

方案四:

将mysql和redis更新放在一个事务中操作,这样能保证达到强一致性。

这种方案的缺点:

1、mysql或者redis任何一个环节出问题,都会造成数据回滚或者撤销。

2.如果网络出现超时,不仅可能会造成数据回滚或者撤销,还会有并发问题。

 

方案五:

通过订阅mysql的Binlog 日志来更新redis, 把我们搭建的mq消费服务,作为mysql的一个salve ,订阅Binlog ,解析出更新的内容,再更新redis.

这种方案的缺点:

要单独搭建一个同步服务,并且来引入BinLog同步机制,成本较大。 

 

多级缓存和数据库之间的一致性问题_第2张图片

 

 

        

你可能感兴趣的:(分布式缓存)