Redis 分布式锁实现深度解析

Redis 分布式锁是分布式系统中协调多进程/服务对共享资源访问的核心机制。以下从基础概念到高级实现进行全面剖析。

一、基础实现原理

1. 最简实现(SETNX 命令)

# 加锁
SET resource_name my_random_value NX PX 30000# 解锁(Lua脚本保证原子性)
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

关键要素

  • NX:仅当key不存在时设置(原子性保证)
  • PX 30000:30秒自动过期(防死锁)
  • my_random_value:唯一客户端标识(防误删)

2. 实现演进对比

版本

方案

问题

v1.0

SETNX + EXPIRE

非原子操作可能死锁

v2.0

SET NX PX

无法解决误删锁问题

v3.0

唯一值 + Lua解锁

基本满足需求

v4.0

Redlock算法

解决单点问题

二、Redis 单实例实现详解

1. 完整加锁流程

sequenceDiagramparticipant Clientparticipant RedisClient->>Redis: SET lock:order UUID123 NX PX 30000alt 锁空闲Redis-->>Client: OKClient->>Client: 启动看门狗线程else 锁占用Redis-->>Client: nilClient->>Redis: BLPOP lock:order:notify 30Redis--xClient: 等待通知或超时end

2. 看门狗机制(续期)

def watchdog(lock_key, client_id, ttl):while True:time.sleep(ttl / 3)  # 每10秒续期一次if not redis.call("EVAL", "if redis.call('get', KEYS[1]) == ARGV[1] then " +"return redis.call('pexpire', KEYS[1], ARGV[2]) " +"else return 0 end",1, lock_key, client_id, ttl):break  # 续期失败退出

3. 解锁通知优化

lua

-- 解锁时发布通知
redis.publish("lock:order:notify", "released")-- 客户端订阅
SUBSCRIBE lock:order:notify

三、Redlock 集群算法

1. 算法流程

  1. 获取当前毫秒级时间戳 T1
  2. 依次向 N 个 Redis 节点请求加锁(相同TTL)
  3. 计算获取锁耗时 = 当前时间 T2 - T1
  4. 当且仅当满足:
    • 获得多数节点(N/2 + 1)认可
    • 总耗时 < 锁TTL
  1. 锁有效时间 = 初始TTL - 获取锁耗时

2. 节点故障处理

graph TDA[客户端] --> B[Redis Master1]A --> C[Redis Master2]A --> D[Redis Master3]B -->|响应超时| E[标记节点不可用]C -->|成功获取| F[锁计数+1]D -->|成功获取| F

3. 关键参数配置

参数

建议值

说明

节点数

5

允许2个节点故障

重试延迟

50-200ms

随机化避免冲突

锁TTL

10-30s

业务完成时间+缓冲

四、生产级问题解决方案

1. 时钟漂移问题

场景

  • 节点间时钟不同步导致TTL计算错误

解决方案

python

# 使用单调时钟而非系统时钟
start_time = get_monotonic_time()
elapsed = get_monotonic_time() - start_time
remaining_ttl = initial_ttl - elapsed

2. GC停顿导致锁失效

应对策略

  • 设置保守TTL(业务最大耗时×2)
  • 添加JVM监控告警
  • 关键业务禁用GC(如ZGC)

3. 客户端长时间阻塞

优化方案

java

// 非阻塞尝试
boolean locked = tryLock(5, TimeUnit.SECONDS);// 异步获取
RFuture<Boolean> future = lock.tryLockAsync();

五、各语言实现对比

语言

推荐库

特性

Java

Redisson

支持看门狗、多种锁类型

Go

redsync

实现Redlock算法

Python

redis-py

基础锁实现

Node.js

node-redlock

TypeScript支持

六、性能优化方案

1. 锁分段技术

python

def get_segment_lock(resource_id):segment = resource_id % 16  # 分为16段return f"lock:{resource_type}:{segment}"# 使用示例
lock = get_segment_lock(order_id)

2. 读写锁分离

redis

# 写锁
SET rwlock:order WRITE <client_id> NX PX 10000# 读锁计数器
INCR rwlock:order:read_count

3. 热点锁优化

策略

实施方法

适用场景

本地缓存

先获取本地锁再尝试分布式锁

极高并发

令牌桶

控制获取锁的速率

突发流量

乐观锁

CAS机制更新资源

冲突较少

七、监控与告警指标

1. 关键监控项

bash

# Redis监控
redis-cli info stats | grep lock
redis-cli slowlog get  # 查看锁命令耗时# 客户端监控
lock_acquire_time_seconds_bucket{le="0.1"} 0.95  # 99%锁获取<100ms
lock_hold_time_seconds_sum / lock_hold_time_seconds_count  # 平均持有时间

2. 告警规则示例

yaml

# Prometheus规则
- alert: HighLockContentionexpr: rate(redis_commands_total{cmd="SET",arg0~="lock:*"}[1m]) > 100for: 5mlabels:severity: warningannotations:summary: "High lock contention detected"

八、选型决策指南

mermaid

graph TDA[需要强一致性?] -->|是| B[Redlock+5节点]A -->|否| C[单Redis+看门狗]B --> D[业务容忍延迟?]D -->|是| E[同步确认]D -->|否| F[异步确认]C --> G[需要自动续期?]G -->|是| H[Redisson]G -->|否| I[基础SETNX]

通过深入理解这些原理和实现细节,可以构建出既安全又高效的Redis分布式锁方案。建议根据实际业务场景的CAP需求进行技术选型和参数调优。

Redisson分布式锁深度解析:原理与实现机制 参见上一篇

Redisson分布式锁深度解析:原理与实现机制-CSDN博客

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

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

相关文章

kubernetes》》k8s》》 kubeadm、kubectl、kubelet

kubeadm 、kubectl 、kubelet kubeadm、kubectl和kubelet是Kubernetes中不可或缺的三个组件。kubeadm负责集群的快速构建和初始化&#xff0c;为后续的容器部署和管理提供基础&#xff1b;kubectl作为命令行工具&#xff0c;提供了与Kubernetes集群交互的便捷方式&#xff1b;而…

linux 硬盘扩展

场景&#xff1a; [rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 …

Docker Desktop 界面功能介绍

Docker Desktop 界面功能介绍 左侧导航栏 Containers(容器): 用于管理容器,包括查看运行中或已停止的容器,检查容器状态、日志,执行容器内命令,启动、停止、删除容器等操作。Images(镜像): 管理本地 Docker 镜像,可查看镜像列表、从 Docker Hub 拉取新镜像、删除镜…

C++细节知识for面试

1. linux上C程序可用的栈和堆大小分别是多少&#xff0c;为什么栈大小小于堆&#xff1f; 1. 栈&#xff08;Stack&#xff09;大小 栈默认为8MB&#xff0c;可修改。 为什么是这个大小&#xff1a; ​安全性&#xff1a;限制栈大小可防止无限递归或过深的函数调用导致内存…

数据设计(范式、步骤)

文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式&#xff0c;指导如何设计一个关系型数据库。 1NF&#xff1a; 关系表的每个字段&#xff0c;都应该是不可再分的&#xff0c;——保证原子性。 字…

PhotoShop学习03

1.更改图像大小 通常情况下&#xff0c;如果我们想在某些上传图片&#xff0c;会发现我们的图片可能会过大或者过小&#xff0c;为此&#xff0c;我们需要调整图像的大小&#xff0c;使之符合网站的规则。 首先打开photoshop&#xff0c;打开一张图片。首先我们需要了解这张图…

Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?

大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素&#xff0c;有哪些注意事项&#xff1f; 在 Vue 项目里&#xff0c;$refs 是个超实用的工具&#xff0c;它能让你直接访问组件实例或者 DOM 元素。不过使用的时候&#xff0c;有一些地方可得注意&#xff0c;下面咱就详细…

【安全运营】关于攻击面管理相关概念的梳理(二)

CYNC&#xff08;持续可见性和网络控制&#xff09; CYNC&#xff08;Continuous Visibility and Network Control&#xff09;即“持续可见性和网络控制”&#xff0c;是一个与网络安全和IT运营管理相关的概念。它强调的是在一个组织的数字环境中&#xff0c;确保对所有资产、…

【区块链安全 | 第二篇】区块链概念详解

文章目录 概述1. 区块链类型2 区块链五层架构3 账本模型4. 节点&#xff08;Node&#xff09;5. 区块&#xff08;Block&#xff09;6. 区块链&#xff08;Blockchain&#xff09;7. 区块链工作流程 核心技术1. 共识机制2. 智能合约 主要组件1. 交易&#xff08;Transaction&am…

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…

HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)

一、概述 网格对象的编辑排序是用于网格对象的编辑、拖动排序、新增和删除。 说明 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二、导入模块 import { GridObjectSortComponent, GridObjectSortComponentItem…

RFID技术在机器人中的核心应用场景及技术实现

一、机器人定位与导航 1. 地标定位系统 实现方式: 在环境关键点部署无源RFID标签(如UHF Tag),机器人携带读写器通过读取标签ID实现绝对定位# 伪代码:RFID地标定位 def get_robot_position():detected_tags = reader.read_tags()known_positions = {tag1: (x1,y1), tag2: …

uv 命令用conda命令解释

uv&#xff1a;安装 | uv-zh-cn 功能 | uv-zh-cn #showkey -a 可看按键的"\eOP"转义序列是啥# 绑定快捷键 f1 到 source .venv/bin/activate函数 bind "\eOP": "source .venv/bin/activate " #conda activate# 绑定快捷键 f2 到uv add函数 …

《探秘SQL的BETWEEN:解锁数据范围查询的深度奥秘》

在数据的广袤宇宙中&#xff0c;结构化查询语言&#xff08;SQL&#xff09;宛如一座精密的导航系统&#xff0c;引导我们穿越数据的浩瀚星河&#xff0c;精准定位所需信息。其中&#xff0c;BETWEEN作为SQL的关键工具之一&#xff0c;以其独特的能力&#xff0c;在数据的海洋里…

大型语言模型的秘密:思考链长度与提示格式的魔力

嘿&#xff0c;朋友们&#xff01;今天我要和大家聊聊一个超级酷的话题——大型语言模型&#xff08;LLMs&#xff09; 它们在“思考”和回答问题时的一些“小秘密”。你可能已经听说过**“思考链”&#xff08;Chain of Thought, COT** 这个概念&#xff0c;它是一种让模型在回…

RHCE工程师特训指南

RHCE&#xff08;红帽认证工程师&#xff09;是Linux领域极具含金量的认证之一&#xff0c;其考试以实操为主&#xff0c;注重系统管理、网络服务配置及自动化运维能力。以下内容可帮助对RHCE考生高效规划学习路径。 一、RHCE认证概述 认证结构 RHCE认证分为两部分&#xff…

Vue 3 中 slot插槽的使用方法

插槽&#xff0c;名字挺新奇。但不要被他的名字难住。其实就是父组件向子件件传递信息的一种手段。我们可以用这样的方法向子组件传值。 父组件&#xff08;app.vue) <template><MyCompoent :transData"{a:reactiveObj.a,breactiveObj.b,c}"> </tem…

大模型中的召回次数是什么意思

大模型中的召回次数是什么意思 在大语言模型&#xff08;LLM&#xff09;和检索增强生成&#xff08;RAG&#xff09;系统中&#xff0c;召回次数&#xff08;Recall Count&#xff09;是一个重要的参数&#xff0c;它决定了在检索阶段从知识库中提取多少候选文档或片段。这个…

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…