Redis-redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

Redis的面试连环炮

面试题

redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

面试官心理分析

这个也是线上非常常见的一个问题,就是多客户端同时并发写一个 key,可能本来应该先到的数据后到了,导致数据版本错了;或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。

而且 redis 自己就有天然解决这个问题的 CAS 类的乐观锁方案。

面试题剖析

 

Redis并发竞争的问题是什么?

这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了

如下图所示:我们有好几个系统同时取访问缓存,并且发起了一个写缓存的操作

  • set V1、V2、V3、V4
  • 我们期望的是它是有顺序的去执行,但是最后却没有顺序了
  • 变成了:set V1、V3、V4、V2
  • 一般解决这种问题,就是使用分布式锁
  • redis事务也可以解决,但是用得少(基本不用)

01_redis并发竞争问题以及解决方案

基于Zookeeper的分布式锁

某个时刻,多个系统实例都去更新某个 key。可以基于 zookeeper 实现分布式锁。每个系统通过 zookeeper 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 key,别人都不允许读和写。

zookeeper-distributed-lock

你要写入缓存的数据,都是从 mysql 里查出来的,都得写入 mysql 中,写入 mysql 中的时候必须保存一个时间戳,从 mysql 查出来的时候,时间戳也查出来。

 

每次要写之前,先判断一下当前这个 value 的时间戳是否比缓存里的 value 的时间戳要新。如果是的话,那么可以写,否则,就不能用旧的数据覆盖新的数据。

分布式锁:确保同一时间,只有一个系统实例在操作某个key,别人都不需要读和写

这里修改的时候,就需要引入时间戳,因为写入缓存的数据,都是从mysql中查询出来的,都得写入mysql中,写入mysql的时候,是必须保存一个时间戳,同时查询的时候,也需要把时间戳也查询出来

v1 10.00.00
v2 10.00.01
v3 10.00.02
v4 10.00.03

每次要写入之前,首先判断一下当前这个value的时间戳是否比缓存的value的时间戳大,如果比缓存中的时间戳更大,那么就执行写入操作,如果更小,就不能用旧的数据覆盖新的数据。

Redis的事务

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序串行化的执行而不会被其他命令插入。Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

其中,Redis事务分为三个阶段

  • 开始事务
  • 命令入队
  • 执行事务

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值