怎样实现redis分布式锁

实现redis分布式锁的步骤:1、加锁;2、释放锁;3、给锁设置有效期;4、给锁设置少数值;5、通过LUA脚本实现释放锁的原子性。加锁是指,执行 setnx 为一个代表锁键设置值,如果能设置成功,则表示获得锁,失败则无法获得锁。

怎样实现redis分布式锁-Worktile社区

1、加锁

Redis 的 setnx 命令会判断键值是否存在,如果存在则不做任何操作,并返回0,如果不存在,则创建并赋值,并返回1,因此我们可以执行 setnx 为一个代表锁键设置值,如果能设置成功,则表示获得锁,失败则无法获得锁。

代码:

# 使用key为lock来表示一个锁
setnx lock 1 

2、释放锁

当执行好操作之后,要释放锁的时候直接把 Redis 里的键值 lock 删除就可以了,这样其他进程才能通过 setnx 命令重新设置并获得该锁。

代码:

# 释放锁
del lock

通过上面两个命令,我们实现了一个简单的分布式锁,但这里就出现了一个问题:如果一个进程通过 setnx 命令加锁之后,在执行具体操作出错了,没有办法及时释放锁,那么其他进程就无法获得该锁,系统便无法继续往下执行,解决这个问题的办法就是为锁设置一个有效期,在这个有效期之后,自动释放锁。

3、给锁设置有效期

给锁设置有效期非常简单,直接使用 Redis 的 expire 命令就可以了,如:

# 加锁
setnx lock 1 
# 给锁设置10s有效期
expire lock 10 

但是,现在又出现另一个问题了,如果我们在设置了锁之后,执行 expire 命令之前该进程挂掉了,那么 expire 就没有执行成功,锁一样是没有被释放掉的,所以一定要保证上面两个命令要一起执行,怎么保证呢?

有两个方法,一个是使用 LUA 语言编写的脚本,另一个是使用 Redis 的 set 命令, set 命令后面跟 nx 参数后,执行的效果与 setnx 一致,且 set 命令可以跟 ex 参数来设置过期时间,所以我们可以使用 set 命令把 setnx 和 expire 两个合并在一起,这样就可以保证执行的原子性了。

4、给锁设置少数值

如何区分其他进程的锁,避免删除其他进程的锁呢?答案就是每个进程在加锁的时候,给锁设置一个少数值,并在释放锁的时候,判断是不是自己设置的锁。给锁设置少数值的时候,一样是使用 set 命令,少数的不同是将键值1改为一个随机生成的少数值,比如uuid。

代码:

 # rand_uid表示少数id
set lock rand_id nx ex 10

当锁里的值由进程设置后,释放锁的时候,就需要判断锁是不是自己的,步骤如下:

  • 通过 Redis 的 get 命令获得锁的值
  • 根据获得的值,判断锁是不是自己设置的
  • 如果是,通过 del 命令释放锁。

此时我们看到,释放锁需要执行三个操作,如果三个操作依次执行的话,是没有办法保证原子性的。解决这个问题的办法就是保证上述三个操作执行的原子性,即在执行释放锁的三个操作中,其他进程不可以获得锁,想要做到这一点,需要使用到LUA脚本。

5、通过LUA脚本实现释放锁的原子性

Redis 支持 LUA 脚本, LUA 脚里的代码执行的时候,其他客户端的请求不会被执行,这样可以保证原子性操作,所以我们可以使用下面脚本进行锁的释放:

if redis.call("get",KEYS[1]) == ARGV[1] then 
  return redis.call("del",KEYS[1])
else 
  return 0
end

将上述脚本保存为脚本后,可以调用 Redis 客户端命令 redis-cli 来执行,如下:

# lock为key,rand_id表示key里保存的值
redis-cli --eval unlock.lua lock , rand_id 

延伸阅读

分布式锁的特征

  • 互斥性:任意时刻,只有一个客户端能持有锁。
  • 锁超时释放:持有锁超时,可以释放,防止不必要的资源浪费,也可以防止死锁。
  • 可重入性:一个线程如果获取了锁之后,可以再次对其请求加锁。
  • 高性能和高可用:加锁和解锁需要开销尽可能低,同时也要保证高可用,避免分布式锁失效。
  • 安全性:锁只能被持有的客户端删除,不能被其他客户端删除

文章标题:怎样实现redis分布式锁,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/34703

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Z, ZLWZ, ZLW认证作者
上一篇 2023年1月8日 上午4:03
下一篇 2023年1月8日 上午4:39

相关推荐

  • 有哪些可以提升效率的软件推荐

    可以提升效率的软件推荐有:1、滴答清单;2、爱时间;3、憨憨时间管理;4、时间官;5、时间管理。其中,滴答清单这款软件的用处是比较多的,在里面有一个大概的任务清单,小伙伴们可以把当天要做的事情全部都录入进去,然后在软件里面还会有一个选项,就是优先处理的事情。 一、滴答清单 这款软件的用处是比较多的,…

    2023年5月5日
    23700
  • 项目管理adcp什么意思

    项目管理中的ADCP是“活动定义、活动排序、活动资源估算、活动持续时间估算”的缩写,表示项目管理过程的关键步骤。1、活动定义涉及详细识别并确定工作范围内所有必须进行的具体行动或任务;2、活动排序则是确定项目活动之间的逻辑关系;3、活动资源估算涉及判定完成每项活动所需的资源类型与数量;4、活动持续时间…

    2024年1月8日
    50400
  • 云原生应用的可伸缩性实现方法

    在云原生应用的不同特点中,可伸缩性是其核心优势之一。1、通过横向扩展添加更多实例来增加容量;2、 利用自动化工具进行实时弹性调整;3、采用无状态架构设计;4、实施微服务架构以提高独立服务的可扩展性;5、通过容器编排工具简化伸缩过程,例如Kubernetes;6、使用消息队列和事件驱动架构来确保高并发…

    2023年12月28日
    26900
  • 控制键esc的功能是什么

    控制键esc的功能是取消当前输入的命令、退出当前的操作等,也可称为取消/退出按键。ESC是强行退出键,源于英文Escape,它的作用是:用于退出正在运行的系统,在有多层菜单的软件中,往往用于返回上一层菜单或退出。 一、控制键esc的功能 ESC键作用的是取消当前输入的命令、退出当前的操作等,也可称为…

    2023年1月9日
    2.8K00
  • MQTT在工业自动化中的应用对比是什么

    在工业自动化领域,信息的可靠传递至关重要。MQTT协议作为一种轻量级的消息传输协议,已被广泛应用于此领域,提供稳定性、简易性及低带宽下的信息传输优势。1、信息传输机制的高效性:MQTT基于发布/订阅模型,有效降低网络带宽和设备资源使用,适合远程通信和网络条件受限的工业场景。2、协议的轻量级:相对于其…

    2024年1月5日
    31000
  • 研发项目团队管理

    开展研发项目时,团队管理的五大要点包括:1、明确目标和期望,2、确保资源的合理配置,3、采用适宜的技术与方法,4、实施有效沟通,5、持续监督与团队建设。例如,确保资源的合理配置是至关重要的一环,这包括但不限于:分配合适的人员、确保研发所需材料与工具的供应、以合理的时间安排面对项目的各阶段,并对预算进…

    2024年1月10日
    19500
  • plm研发管理平台

    PLM (Product Lifecycle Management) 研发管理平台 是一套帮助企业在整个产品寿命周期内实现数据管理和流程优化的系统。重点功能包括①产品数据管理、②协同工作流程、③供应链管理和④集成与自动化。 其中,产品数据管理是PLM平台的核心,它涉及产品从概念设计到退市的所有信息和…

    2024年1月10日
    22700
  • 弹性云服务器由哪些部分组成

    弹性云服务器是由CPU、内存、操作系统、云硬盘组成的最基础的计算组件。弹性云服务器创建成功后,可以像使本地PC或物理服务器一样,使用弹性云服务器。弹性云服务器的开通,只需要指定CPU、内存、操作系统、规格、登录鉴权方式即可。 什么是弹性云服务器 弹性云服务器(Elastic Cloud Server…

    2022年10月13日
    81400
  • 淘宝的商品数据库的结构是怎样的

    淘宝的商品数据库结构设计关键在于能够高效支持大规模商品信息的存储、检索及管理功能。主体答案为:数据库结构包括商品信息表、商品分类表、店铺信息表、用户信息表、订单信息表。商品信息表负责存储商品详情,包含1、商品ID 2、商品名 3、价格 4、库存 5、商品描述 6、图片链接。商品分类表维护商品类别信息…

    2023年11月15日
    58100
  • VC++ 与 C++ 有什么区别

    区别是:VC++是微软公司的免费C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。C++是一种计算机高级程序设计语言,由C语言扩展升级而产生,较早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。 VC++ Microsoft Visual …

    2023年2月16日
    1.5K00

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部