2赞

9回答

0收藏

实现一个 Redis 分布式锁

后端 后端 2066 人阅读 | 9 人回复 | 2020-07-27

2908813428-0eddf62cfb261264_articlex.jpg


前言在我们日常开发中,难免会遇到要加锁的情景。例如扣除产品库存,首先要从数据库中取出库存,进行库存判断,再减去库存。这一波操作明显不符合原子性,如果代码块不加锁,很容易因为并发导致超卖问题。咱们的系统如果是单体架构,那我们使用本地锁就可以解决问题。如果是分布式架构,就需要使用分布式锁。

方案使用 SETNX 和 EXPIRE 命令
  1. if (setnx(<font color="#ff0000">"item_1_lock"</font>,<font color="#2e8b57"> 1</font>)) {
  2.     expire(<font color="#ff0000">"item_1_lock"</font>, <font color="#2e8b57">30</font>);
  3.     try {
  4.         ... 逻辑
  5.     } catch {
  6.         ...
  7.     } finally {
  8.         del(<font color="#ff0000">"item_1_lock"</font>);
  9.     }
  10. }
复制代码
这种方法看起来可以解决问题,但是有一定的风险,因为 SETNX 和  EXPIRE 这波操作是非原子性的,如果 SETNX 成功之后,出现错误,导致 EXPIRE 没有执行,导致锁没有设置超时时间形成死锁。


作者:曾是然
        链接:https://segmentfault.com/a/1190000023391434
        来源:SegmentFault 思否
        著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 9 个

test

发表于 2020-7-30 09:46:21 来自手机 | 显示全部楼层

好吧你厉害
回复

使用道具 举报

test

发表于 2020-7-30 09:47:29 来自手机 | 显示全部楼层

哈哈哈哈
回复

使用道具 举报

test

发表于 2020-8-3 12:12:28 来自手机 | 显示全部楼层

不可能的。谎言
mmexport1596300467125.png
回复

使用道具 举报

test

发表于 2021-2-24 13:52:00 | 显示全部楼层

本帖最后由 test 于 2021-2-24 13:53 编辑

测试一下代码
  1. <scprint>
  2.   alert(23);
  3. </script>
复制代码

回复

使用道具 举报

test

发表于 2021-2-24 13:54:53 | 显示全部楼层

  1. <scprint>
  2.   alert(2);
  3. </script>
复制代码
回复

使用道具 举报

test

发表于 2021-4-20 10:08:50 | 显示全部楼层

测试一下表情
回复

使用道具 举报

test

发表于 2021-7-25 21:48:35 来自手机 | 显示全部楼层

基本上没有办法的.
安下面操作试试看
Screenshot_20210721_181924_com.huawei.systemmanager.jpg
回复

使用道具 举报

test

发表于 2021-9-22 18:01:53 | 显示全部楼层

2撒大苏打
回复

使用道具 举报

test

发表于 2023-11-29 13:46:12 | 显示全部楼层

aaaaaa
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则