redis做分布式锁实战案例详解

好久没更新文章了,近几天在研究分布式锁,今天就更新下redis分布式锁的内容;

环境:nginx+redis+idea+jmeter(压力测试),思路:nginx将请求转发到两台服务器(我本地启动两台),两台服务器进行抢夺资源

注意:由于资源有限,这里nginx和redis我都以windows版本为例进行试验

第一:windows环境下下载nginx并使用文章链接如下:

windows环境下玩转nginx入门篇_酒书的博客-CSDN博客

第二:windows环境下下载redis并使用文章链接如下:

windows环境下入门redis_windows环境如何学习redis_酒书的博客-CSDN博客

第三:使用windows环境下下载jmeter工具并进行压测文章链接如下:

jmeter下载并简单使用_下载使用jmeter_酒书的博客-CSDN博客

好,接下来进入切入正题,我们模拟买东西案例,商品数量存储在redis中,然后启动两台idea通过nginx转发进行消费,如下图:

看代码逻辑是很简单的,从redis中取商品数量,商品数量大于0就减一然后写回redis,这个时候我们是没有使用分布式锁的,我们只加了synchonized单机锁,那么有没有问题呢,我用jmeter瞬间打过去200个请求,运行效果如图所示:

()

大家看到了吧,严重的超卖现象,如果生产出现这种问题那肯定被封为T0及BUG超级会员,可能要被祭天,原因就是我们现在是两台服务器而synchonized锁的只是jvm层面,是一把单机锁,在单机情况下

绝对没问题,那么怎么解决这个问题呢,下面只能有请redis分布式锁出山了(后面会讲解zk版本的分布式锁,感兴趣的点个关注哦),好我们接下来修改代码,通过setnx(熟悉不)来实现分布式锁版本1,代码如下:

我们通过setIfAbsent来设置锁,抢到锁了就继续执行,没抢到就给你一个友好提示,最后finally代码块释放锁

那么上面加上分布式锁之后的代码有没有问题呢铁子,想想有没有问题,其实是有问题的,问题就是:执行到一半出问题了,导致就没执行finally代码块,那锁一直存在没有释放,其他线程就获取不到锁,那不就game over了铁子,所以我们要加个过期时间对不对,给它10s,10s后自动释放锁让其他线程来使用,修改一下如图所示:

那我加上过期时间其实还存在问题,就是“张冠李戴”,比如我A线程抢到了锁,可能处理了12秒还没处理完业务逻辑,但是10秒的时候A线程的锁就过期了被自动删除了,这个时候B带着自己的锁进来了,15秒的时候A处理完自己的那些事情了然后走finally代码块删除锁,这个时候A就把B的锁给删除了,以此类推是不是就出大问题了,所以我们要解决每个线程只能删除自己的锁,修改代码如下:

我判断一下是自己的锁再进行删除,然后老铁你思考下是不是还存在一个恐怖的问题,就是finally代码块中删除所的代码不具备原子性,那多线程肯定有问题对不对,解决原子性问题redis官方给出建议使用lua

脚本解决(lua脚本铁子们自己百度一下就很ok),那我们继续修改代码,使用lua脚本解决原子性问题:

lua脚本出自这个链接:SET | Redis

此时我们就通过lua脚本解决了原子性问题,到此为止如果你的公司并发量不是特别特别大使用目前代码基本上可以解决问题了,但是当并发特别大的时候还是有问题的

问题一:设置过期时间10s合理吗?我处理业务时间可能10s可能20s或者30s不一定是吧,所以要解决分布式锁如何续期的问题(就像你开车从河南开封到郑州,路上没油了要加油保证到达郑州)

问题而:我刚把数据set到redis,redis主机收到之后还没来得及把数据同步给备机就挂了,那是不是就出现数据丢失问题

针对上面两个问题我们手写解决很难,就算写出来了你能保证不出问题?傻子才手写解决上面两个问题呢

既然不手写解决,那肯定有可以解决的方法,接下来有请RedLock出场,记住这不是红楼梦锁,也不是红烧牛肉锁,它就是RedLock,能够帮助我们解决上面两个问题,俗话说的好天上飞的理念必定有落地的实现,RedLock的落地实现Redisson,我们就用Redisson来解决,Redisson主要通过一个watchdog(看门狗)来解决续期的问题,感兴趣的可以看下源码,下面直接上代码,如下图:

运行效果如图所示:

好了老铁们,到此为止功德圆满,最后提醒一下小伙伴们注意springboot和redisson版本问题,关于依赖版本如图所示:

源码已经上传CSDN,一共两套源码,使用lua版本的和使用redisson版本的,下载地址如下:

https://download.csdn.net/download/royal1235/14044114

走过路过不要错过,联系小编可以扫码关注公众号哦

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒书

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值