Redis分布式锁-基础篇

7 篇文章 0 订阅
4 篇文章 0 订阅

前提知识:
在这里插入图片描述

创建两台单机版,端口号不同的redis服务。主要代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题一:多线程,没加锁,有两种锁,synchronized和lock,lock会更加灵活,可以tryLock,如下:

在这里插入图片描述
在这里插入图片描述
为了方便,使用synchronized,单机版下使用没用问题。但是分布式部署下,单机锁还是会出现超卖问题,因为不是在同一个jvm层面的锁,所有需要分布式锁。
在这里插入图片描述

问题二 使用nginx进行负载均衡,轮询发送部署两台服务器,用Jemeter进行压测,就出现了超卖现象。

在这里插入图片描述
解决:
在这里插入图片描述
解锁:
在这里插入图片描述

解决:单机版synchronized可以去掉。利用redis中setNx特性
在这里插入图片描述
在这里插入图片描述

还存在问题:

万一程序中间出现问题,执行不到关锁代码,所以,需要在finally强制关锁
在这里插入图片描述

还可以存在问题:

程序宕机了 设置加锁过期时间
在这里插入图片描述
注意:加锁和设置过期时间要保证是原子操作。
在这里插入图片描述

还存在问题:如果a线程执行业务大于10s还未结束,b线程就开始执行并设置锁,a线程执行完毕后删除了b线程的锁,导致出现了问题。

在这里插入图片描述

解决:因为每个value是不同的,需要加一层判断,只能删除自己的key
在这里插入图片描述

这样写还是存在问题

判断和删除不是原子性的,需要用lua脚本,官网解释
在这里插入图片描述
在这里插入图片描述

不用lua脚本,其他解决方案?

redis支持事务。
在这里插入图片描述
在这里插入图片描述

演示
在这里插入图片描述
watch防止在加事务的时候,其他修改k1的值,保证加在事务期间,别人无法修改k1
成功情况
在这里插入图片描述
失败情况
其他客服端在k1被监控的时候,修改了k1的值,最后exec提交失败,如下图例子:
在这里插入图片描述
在这里插入图片描述

事务代码写法

在这里插入图片描述

lua脚本写法

用jedis客户端写:
在这里插入图片描述

在这里插入图片描述

最后还存在两个问题

1.设置的10s不确认是否足够,确保业务时候不会超过过期时间,如何续期?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值