蚂蚁金服java面试真题:如何保障mysql和redis之间的数据一致性?

如何保障mysql和redis之间的数据一致性?

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。

懒加载

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存和数据库间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。举个例子:

  1. 如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  2. 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。如何解决?

所以结合前面例子的两种删除情况,我们就考虑前后双删加懒加载模式。那么什么是懒加载?就是当业务读取数据的时候再从存储层加载的模式,而不是更新后主动刷新,它涉及的业务流程如下如所示:

理解了懒加载机制后,结合上面的业务流程图,我们讲解下前后双删如何做?

延迟双删

在写库前后都进行redis.del(key)操作,并且第二次删除通过延迟的方式进行。

方案一(一种思路,不严谨)具体步骤是:

1)先删除缓存;

2)再写数据库;

3)休眠500毫秒(根据具体的业务时间来定);

4)再次删除缓存。

那么,这个500毫秒怎么确定的,具体该休眠多久呢?

需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的,

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一些常见的 MySQLRedis 面试及其答案: MySQL 面试: 1. 什么是索引?它有什么作用? 答:索引是一种数据结构,它可以加快查询速度。它通过将数据的某些列或表达式的值存储在一个单独的数据结构中,使得查询能够更快地定位到所需的数据。 2. 什么是事务? 答:事务是一个操作序列,它将数据库从一个一致的状态变为另一个一致的状态。事务必须满足 ACID 属性:原子性、一致性、隔离性和持久性。 3. 什么是视图? 答:视图是一个虚拟表,它是从一个或多个表中选择出来的一些列。视图的目的是简化复杂的查询,并提供更简单、更清晰的数据访问方式。 4. 什么是主键和外键? 答:主键是用于唯一标识表中每个行的一列或一组列。外键是一个表中的列,它与另一个表中的主键列相关联。外键用于保持两个表之间的关联性。 Redis 面试: 1. Redis 支持哪些数据结构? 答:Redis 支持字符串、哈希、列表、集合和有序集合这五种数据结构。 2. Redis 的持久化机制有哪些? 答:Redis 支持两种持久化机制:RDB 和 AOF。RDB 机制将 Redis 数据库的快照保存到磁盘上,而 AOF 机制则将 Redis 操作日志保存到磁盘上。 3. Redis 支持的数据类型中,哪些数据类型是支持过期时间的? 答:Redis 中的 key-value 对可以设置过期时间,其中字符串和哈希支持过期时间设置。 4. Redis 的主从复制机制是什么? 答:Redis 的主从复制机制是指将一个 Redis 服务器的数据复制到另一个 Redis 服务器上。主服务器将数据同步到从服务器,并在后者上创建一个与前者相同的数据副本。主服务器和从服务器之间的通信是异步的,即主服务器不会等待从服务器执行操作的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值