redis--009

一、为什么需要分布式锁

1. 单机锁局限

synchronized、Lock 属于JVM 本地锁,只在单个 JVM 进程内生效。 集群部署,多个服务实例(多个 JVM),本地锁互相感知不到,锁失效。

业务场景:一人一单,集群环境下本地锁无法拦截,用户可以重复下单优惠券。

2. 分布式锁定义

分布式锁:集群 / 分布式环境,多进程之间可见、能够实现互斥的锁。 核心五大特性:

  1. 多进程可见:不同服务实例都能访问锁
  2. 互斥:同一时刻,只允许一个客户端拿到锁
  3. 高性能:获取、释放锁速度快,支持高并发
  4. 高可用:锁服务故障不能直接导致业务瘫痪
  5. 安全性:锁可以释放,不会死锁

二、分布式锁三种实现方案对比

表格

方案 互斥实现 高可用 高性能 安全(死锁防护)
MySQL 数据库锁机制 一般 断开数据库连接自动释放锁
Redis SETNX互斥命令 设置锁超时时间,到期自动释放
Zookeeper 临时有序节点 一般 客户端断开连接,临时节点自动删除释放锁
  • MySQL:性能偏弱,适合并发不高场景
  • Redis:性能最优,互联网项目最常用
  • Zookeeper:可靠性强,性能一般

三、Redis 实现基础分布式锁

1. 获取锁

  • 命令:SET key value NX EX 过期时间
  • NX:互斥,key 不存在才创建,存在直接失败,实现非阻塞;尝试一次,成功拿到锁,失败直接返回,不等待
  • EX:设置锁超时时间,防止服务宕机锁无法释放,造成死锁

2. 释放锁

  • 手动释放:删除锁 key
  • 自动释放:达到 EX 设置的超时时间,Redis 自动删除 key

3. 基础执行流程

  1. 尝试获取锁
  2. 获取失败 → 直接结束业务
  3. 获取成功 → 执行业务逻辑
  4. 业务完成 → 手动释放锁
相关推荐
用户8356290780516 小时前
如何使用 Python 给 Word 文档添加水印
后端·python
一个风轻云淡7 小时前
Markdown学习与实践
后端
程序员cxuan7 小时前
真没想到,AI 圈又杀出来一匹黑马!
人工智能·后端·程序员
吉甫作诵7 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
掘金者阿豪7 小时前
极空间 NAS 部署 Typecho:从 Docker 安装、主题配置到固定公网访问
后端
科技苑7 小时前
前后端分离与微服务架构如何协同?
前端·后端·前端框架
Lambert2817 小时前
AgentScope Java 从零(07):官方有权限引擎,我却在工具里写了个 if
java·后端·ai编程
Ticnix8 小时前
多租户 RAG:让每个用户只检索到自己的知识库
后端·python·agent
Kyrie_kk8 小时前
Java--ThreadLocal线程副本(一)
java·后端
用户9479135811628 小时前
ReAct 不是框架,是一个 while 循环:把 Agent 的推理模式拆到能自己写出来
后端