Redis分布式锁详解

Redis分布式锁详解

分布式锁是在分布式系统中实现互斥访问共享资源的重要机制。Redis因其高性能和原子性操作特性,常被用来实现分布式锁。

一、基础实现方案

1. SETNX + EXPIRE方案(基本版)

# 加锁
SETNX lock_key unique_value  # 设置唯一标识
EXPIRE lock_key 10          # 设置过期时间# 解锁
DEL lock_key                # 删除键

问题

  • 非原子性操作(SETNX和EXPIRE分开执行可能失败)
  • 可能误删其他客户端的锁

2. SET扩展命令方案(推荐)

# 原子性加锁
SET lock_key unique_value NX PX 10000  # NX表示不存在才设置,PX设置毫秒级过期时间# 解锁(Lua脚本保证原子性)
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

优势

  • 原子性加锁
  • 设置过期时间防止死锁
  • 通过唯一值避免误删

二、Redlock算法(多节点版)

当需要更高可靠性时,Redis作者提出的Redlock算法:

  1. 获取当前时间(毫秒)
  2. 依次尝试从N个独立的Redis节点获取锁
  3. 计算获取锁总耗时(小于锁过期时间)
  4. 当从多数节点(N/2+1)获取成功,且总耗时小于锁有效时间,才认为加锁成功
  5. 若失败,向所有节点发起解锁请求

三、Java实现示例(Redisson)

// 1. 获取锁对象
RLock lock = redissonClient.getLock("myLock");try {// 2. 尝试加锁(参数:等待时间,锁自动释放时间,时间单位)boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);if (isLocked) {// 3. 执行业务代码doBusiness();}
} finally {// 4. 释放锁lock.unlock();
}

四、关键问题与解决方案

1. 锁续期(Watchdog机制)

问题:业务执行时间超过锁过期时间
方案:Redisson的看门狗会定期(默认10秒)检查并延长锁时间

2. 可重入性

方案:使用计数器记录重入次数(Redisson已实现)

3. 锁等待与公平性

方案

  • 实现锁等待队列
  • 使用Redis的List结构模拟队列

4. 主从切换问题

问题:主节点崩溃可能导致锁丢失
方案

  • 使用Redlock多节点方案
  • 或使用Redis的WAIT命令确保数据同步

五、生产环境建议

  1. 锁命名规范业务:资源:操作order:123:pay
  2. 超时时间设置
    • 不宜过短(业务未完成锁已释放)
    • 不宜过长(系统故障时恢复慢)
  3. 监控指标
    • 锁获取成功率
    • 平均持有时间
    • 等待队列长度
  4. 降级方案:Redis不可用时切换本地锁或数据库锁

六、与其他方案对比

方案优点缺点适用场景
Redis锁性能高、实现简单可靠性依赖Redis大多数分布式场景
Zookeeper锁可靠性高性能较低强一致性要求场景
数据库锁无需额外组件性能差、有死锁风险简单场景

七、最佳实践

  1. 始终为锁设置合理的过期时间
  2. 使用唯一标识(UUID/线程ID)作为锁值
  3. 释放锁前验证持有者身份
  4. 考虑使用成熟的客户端(如Redisson)而非自己实现
  5. 重要业务实现锁续期机制

Redis分布式锁在大多数场景下能很好工作,但对于对可靠性要求极高的场景,建议考虑Zookeeper或etcd等强一致性协调服务实现的分布式锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建Linux虚拟环境并远程连接,finalshell自定义壁纸

安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机,打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式,然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0,然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…

podman和与docker的比较 及podman使用

Podman 与 Docker 的比较和区别 架构差异 Docker:采用客户端 - 服务器(C/S)架构,有一个以 root 权限运行的守护进程 dockerd 来管理容器的生命周期。客户端(docker 命令行工具)与守护进程进行通信&#x…

【Easylive】HttpServletRequest、HttpServletResponse、HttpSession 介绍

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 这三个是 Java Web 开发(Servlet/JSP)的核心接口,用于处理 HTTP 请求和响应 以及 用户会话管理。它们在 Spring MVC(Controller)中…

Markdown使用说明

以下是Markdown基础使用教程及分割线展示方法: 📝 Markdown基础使用教程 1. 标题 # 一级标题 ## 二级标题 ### 三级标题2. 文本样式 *斜体* 或 _斜体_ **加粗** 或 __加粗__ ***加粗斜体*** 或 ___加粗斜体___ ~~删除线~~3. 列表 - 无序列表项 * 另一…

Jmeter的压测使用

Jmeter基础功能回顾 一、创建Jmeter脚本 1、录制新建 (1)适用群体:初学者 2、手动创建 (1)需要了解Jmeter的常用组件 元件:多个类似功能组件的容器(类似于类) 各元件作用 组件…

【rabbitmq基础】

RabbitMq基础 1.概念2.数据隔离3.使用控制台向mq传递消息1.创建两个队列-“测试队列”,“测试队列2”2.创建一个交换机-"测试交换机"3.测试发送消息3.1让交换机和队列进行绑定3.2发送消息3.3查看消息 4.创建虚拟主机5.java使用rabbitmq5.1 发送消息5.2 消…

加固计算机厂家 | 工业加固笔记本电脑厂家

北京鲁成伟业科技发展有限公司(以下简称“鲁成伟业”)成立于2005年,是集研发、生产、销售与服务于一体的高新技术企业,专注于加固计算机、工业加固笔记本电脑及特种计算机的研发与制造。凭借20年的技术积累与行业深耕,…

链路聚合配置命令

技术信息 加入捆绑组,加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1,不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…

ekf-imu --- 四元数乘法符号 ⊗ 的含义

⊗ 表示四元数的乘法运算: 用于组合两个四元数代表的旋转。四元数乘法是非交换的(即顺序不同结果不同),其定义如下: 若两个四元数分别为: qq0q1iq2jq3k, pp0p1ip2jp3k, 则它们的乘积为:4*1 …

论文阅读Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

原文框架图: 官方代码: https://github.com/phizaz/diffae/blob/master/interpolate.ipynb 主要想记录一下模型的推理过程 : %load_ext autoreload %autoreload 2 from templates import * device cuda:1 conf ffhq256_autoenc() # pri…

OpenVLA-OFT——微调VLA的三大关键设计:并行解码、动作分块、连续动作表示以及L1回归目标

前言 25年3.26日,这是一个值得纪念的日子,这一天,我司「七月在线」的定位正式升级为了:具身智能的场景落地与定制开发商 ,后续则从定制开发 逐步过渡到 标准产品化 比如25年q2起,在定制开发之外&#xff0…

【论文阅读】Dynamic Adversarial Patch for Evading Object Detection Models

一、介绍 这篇文章主要是针对目标检测框架的攻击,不同于现有的攻击方法,该论文主要的侧重点是考虑视角的变化问题,通过在车上布置多个显示器,利用视角动态选择哪一个显示器播放攻击内容,通过这种方法达到隐蔽与攻击的…

多模态技术概述(一)

1.1 多模态技术简介 1.1.1 什么是多模态 多模态(Multimodal)涉及多种不同类型数据或信号的处理和融合,每种数据类型或信号被称为一种模态。常见的模态包括文本、图像、音频、视频等。多模态技术旨在同时利用这些不同模态的数据,以实现更全面、更准确的理…

nginx2

Nginx反向代理(七层代理)、Nginx的TCP/UDP调度器(四层代理)、 一、Nginx反向代理(七层代理) 步骤&#xff1a; ​ 部署后端web服务器集群 ​ 配置Nginx代理服务器 ​ 配置upstream集群池 ​ 调节集群池权重比 <img src"/home/student/Deskt…

调用kimi api

官网支持python&#xff0c;curl和node.js 因为服务器刚好有php环境&#xff0c;所以先用curl调个普通的语音沟通api <?php // 定义 API Key 和请求地址 define(MOONSHOT_API_KEY, sk-PXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgk1); define(MOONSHOT_API_URL, https://…

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

以下是关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析&#xff0c;包括语法、功能、锁机制、使用场景及示例代码&#xff1a; 1. UPDATE 语句 功能 直接修改数据&#xff1a;立即更新表中的数据&#xff0c;并提交修改。无显式锁&#xff1a;虽然会自动加锁&#xff…

在航电系统中提高可靠性的嵌入式软件设计

1.总线余度设计 数据传输采用双余度总线设计&#xff0c;CANFD为主&#xff0c;RS485为备。发送方将相同的数据分别通过双总线来发送&#xff0c;接收方优先处理主线数据。由于总线上数据频率固定&#xff0c;可设置定时器监控主总线的数据&#xff0c;当定时器超时后&#xff…

第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组

题目1 回文数组 小蓝在无聊时随机生成了一个长度为 n 的整数数组&#xff0c;数组中的第 i 个数为 ai&#xff0c;他觉得随机生成的数组不太美观&#xff0c;想把它变成回文数组&#xff0c;也是就对于任意 i∈[1,n] 满足 a i a n − i 1 a_ia_{n−i}1 ai​an−i​1。 小蓝…

netty中的WorkerGroup使用详解

Netty中WorkerGroup的深度解析 WorkerGroup是Netty线程模型中的从Reactor线程组&#xff0c;负责处理已建立连接的I/O读写、编解码及业务逻辑执行。其设计基于主从多Reactor模型&#xff0c;与BossGroup分工协作&#xff0c;共同实现高并发网络通信的高效处理。 一、WorkerGro…

模运算核心性质与算法应用:从数学原理到编程实践

目录 &#x1f680;前言&#x1f31f;数学性质&#xff1a;模运算的理论基石&#x1f4af;基本定义&#xff1a;余数的本质&#x1f4af;四则运算规则&#xff1a;保持同余性的关键 &#x1f99c;编程实践&#xff1a;模运算的工程化技巧&#x1f4af;避免数值溢出&#xff1a;…