Redis学习:Redis实现乐观锁

实际这部分是接着事务那一块,加了一个watch命令。

这里要有一个乐观锁和悲观锁的概念:
悲观锁:

很悲观,认为什么时候都会出现问题,无论做什么都会加锁

乐观锁:

很乐观,认为什么时候都不会出现问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据
获取version
更新的时候比较version

watch命令
使用watch key监控指定数据,相当于乐观锁加锁。类似一个CAS操作。

127.0.0.1:6379> set money 100 # 设置余额:100
OK
127.0.0.1:6379> set use 0 # 支出使用:0
OK
127.0.0.1:6379> watch money # 监视money (上锁)
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY use 20
QUEUED
127.0.0.1:6379> exec # 监视值没有被中途修改,事务正常执行
1) (integer) 80
2) (integer) 20

测试多线程修改值,使用watch可以当做redis的乐观锁操作(相当于getversion)

起两个客户端模拟多线程
线程一

127.0.0.1:6379> watch money # money上锁
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY use 20
QUEUED
127.0.0.1:6379> 	# 此时事务并没有执行

线程二

127.0.0.1:6379> INCRBY money 500 # 修改了线程一中监视的money
(integer) 600

回到线程一客户端

127.0.0.1:6379> EXEC # 执行之前,另一个线程修改了我们的值,这个时候就会导致事务执行失败
(nil) # 没有结果,说明事务执行失败

127.0.0.1:6379> get money # 线程2 修改生效
"600"
127.0.0.1:6379> get use # 线程1事务执行失败,数值没有被修改
"0"

解锁获取最新值,然后再加锁进行事务。

unwatch进行解锁。

实际上用得不多,很多利用redis分布式锁一般是setex+lua脚本(Redisson)

但是redis分布式锁是最简单实现的,但是也会有问题GC阻塞时间太长,导致时间失效,或者是redis服务器时钟漂移(就是两台服务器时间不一致,一个快导致两个服务器一把锁),还有单点故障master挂掉slave成为master也会带来问题。

解决单点故障有redlock,就是对多个端设置时间,但是对于每个redis实例设置一个超时时间,比如书1min有效时间,超时时间是1秒,你在1秒内获取不到这个实例,就取获取下一个锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乐观锁、悲观锁和Redis锁都可以用来实现秒杀系统的并发控制。下面是它们的简要介绍: 1. 乐观锁乐观锁是一种乐观地认为并发操作不会发生冲突的锁机制。在秒杀系统中,可以使用版本号或时间戳作为乐观锁的标识。当用户发起秒杀请求时,先获取当前商品的版本号或时间戳,然后进行比较。如果版本号或时间戳没有被其他请求修改过,说明没有冲突,可以继续执行秒杀操作,同时将版本号或时间戳更新为新值。如果版本号或时间戳发生变化,说明有其他请求修改了商品信息,此时需要回滚操作或进行重试。 2. 悲观锁:悲观锁是一种悲观地认为并发操作会发生冲突的锁机制。在秒杀系统中,可以使用数据库的行级锁来实现悲观锁。当用户发起秒杀请求时,先锁定对应商品的行记录,确保其他请求无法修改该记录,然后执行秒杀操作,最后释放锁。悲观锁的缺点是并发度低,性能较差,但可以保证数据的一致性。 3. Redis锁:Redis是一种内存数据库,提供了分布式锁的实现方式。在秒杀系统中,可以使用Redis的SETNX命令来实现简单的分布式锁。当用户发起秒杀请求时,先尝试获取Redis中指定商品的锁,如果获取成功,则执行秒杀操作,否则等待一段时间后重试。执行完秒杀操作后,释放锁。Redis锁的优点是并发度高,性能较好,但需要注意锁的过期时间设置和处理死锁等异常情况。 以上是三种常见的实现方式,根据具体需求和系统架构选择合适的锁机制来实现秒杀系统的并发控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值