Redis 中实现分布式锁

 更新时间:2026年09月02日 09:50:45   作者:程序员夏洛  
Redis实现分布式锁主要有原生命令和框架两种方式,推荐生产环境使用Redisson框架,本文给大家介绍Redis中实现分布式锁的相关过程,感兴趣的朋友跟随小编一起看看吧

核心原理

利用Redis单线程执行命令、原子性,多个客户端抢占同一个key,抢到key代表获取锁;释放key代表释放锁,以此实现多进程/多机器互斥访问共享资源。

1. 获取锁

错误写法

SET lock 1
EXPIRE lock 30

两条命令非原子,如果执行完set之后服务宕机,没有设置过期时间,锁会永久死锁。

正确命令(原子操作)

SET lock_key unique_value NX EX 30
  • NX:key不存在才设置,保证互斥;
  • EX 30:锁自动过期时间,防止宕机死锁;
  • unique_value:客户端生成唯一标识(UUID/线程ID),用来区分锁是谁加的,不能随便释放别人的锁

2. 释放锁

重点:不能直接DEL lock_key,会把别的线程持有的锁删掉。

错误:直接del

如果业务执行慢,锁过期自动释放,别的线程拿到锁,此时当前线程执行del,直接删掉别人的锁。

正确:Lua脚本原子释放

-- 判断是自己加的锁,才删除
if redis.call('get',KEYS[1]) == ARGV[1] then
    return redis.call('del',KEYS[1])
else
    return 0
end

Lua脚本保证判断+删除是一条原子操作。

3. 锁续期(看门狗机制 watchdog)

  • 场景:业务还没执行完,锁快过期了,锁被自动释放,出现并发问题。
  • 实现:客户端开启后台线程,检测锁快要过期,如果线程还持有锁,自动延长过期时间。
  • Redisson已经封装好看门狗,不需要自己手写。

4. 单机Redis分布式锁存在的问题

  1. 主从异步复制问题:客户端在master拿到锁,锁还没同步到slave,master宕机,slave升级为主,锁丢失,出现锁失效。
  2. 解决方案:Redlock红锁,需要多台独立Redis节点,半数以上节点加锁成功才算拿到锁;运维成本高,实际线上很少用。
  3. 工业更常用:Zookeeper分布式锁 / 数据库乐观锁做兜底。

5. 实际开发建议

尽量直接使用Redisson,不要手写Redis分布式锁。
Redisson已经封装:

  • 原子加锁释放
  • 看门狗自动续期
  • 可重入锁
  • 锁等待、重试机制

总结

  1. 加锁用SET key value NX EX原子命令,设置唯一value;
  2. 释放锁必须Lua脚本校验归属,不能直接del;
  3. 业务超时要看门狗续期,避免锁提前过期;
  4. 单机主从切换会丢锁,Redlock理论解决,工程优先用Redisson。

追问记忆点:原子加锁、唯一标识、Lua释放、看门狗续期、主从丢失锁风险

到此这篇关于Redis 中实现分布式锁的文章就介绍到这了,更多相关Redis 分布式锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis的数据存储及String类型的实现

    Redis的数据存储及String类型的实现

    这篇文章主要介绍了Redis的数据存储及String类型的实现,redis作为k-v数据存储,因查找和操作的时间复杂度都是O(1)和丰富的数据类型及数据结构的优化,了解了这些数据类型和结构更有利于我们平时对于redis的使用,需要的朋友可以参考下
    2022-10-10
  • 大白话讲解调用Redis的increment失败原因及推荐使用详解

    大白话讲解调用Redis的increment失败原因及推荐使用详解

    本文主要介绍了调用Redis的increment失败原因及推荐使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Ubuntu系统中Redis的安装步骤及服务配置详解

    Ubuntu系统中Redis的安装步骤及服务配置详解

    本文主要记录了Ubuntu服务器中Redis服务的安装使用,包括apt安装和解压缩编译安装两种方式,并对安装过程中可能出现的问题、解决方案进行说明,以及在手动安装时,服务器如何添加自定义服务的问题,需要的朋友可以参考下
    2024-12-12
  • 阿里云服务器安装配置redis的方法并且加入到开机启动(推荐)

    阿里云服务器安装配置redis的方法并且加入到开机启动(推荐)

    这篇文章主要介绍了阿里云服务器安装配置redis并且加入到开机启动,需要的朋友可以参考下
    2017-12-12
  • redis数据一致性的实现示例

    redis数据一致性的实现示例

    所谓的redis数据一致性即当进行修改或者保存、删除之后,redis中的数据也应该进行相应变化,本文主要介绍了redis数据一致性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Redis6 主从复制及哨兵机制的实现

    Redis6 主从复制及哨兵机制的实现

    本文主要介绍了Redis6 主从复制及哨兵机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 一文搞懂Redis中String数据类型

    一文搞懂Redis中String数据类型

    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。今天通过本文给大家介绍下Redis中String数据类型,感兴趣的朋友一起看看吧
    2022-04-04
  • Redis利用逻辑过期解决缓存击穿问题

    Redis利用逻辑过期解决缓存击穿问题

    本文主要介绍了Redis利用逻辑过期解决缓存击穿问题,介绍了两种解决方案,互斥锁与逻辑过期,介绍了两种解决方案:互斥锁与逻辑过期,并重点阐述了逻辑过期的实现原理与代码示例,强调了在高并发场景下选择逻辑过期的重要性及二次检查的必要性
    2026-06-06
  • redis GEO数据结构、实现附近商铺功能实践

    redis GEO数据结构、实现附近商铺功能实践

    文章介绍了Redis中的GEO命令及其用途,包括地理坐标存储、距离计算、坐标转换和位置搜索等功能,还分享了如何使用Redis实现查询附近商铺的功能,包括导入商铺信息和根据类型及距离进行搜索
    2025-12-12
  • 浅谈Redis分布式锁的正确实现方式

    浅谈Redis分布式锁的正确实现方式

    这篇文章主要介绍了浅谈Redis分布式锁的正确实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论