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. 业务完成 → 手动释放锁
相关推荐
东风破_9 小时前
从输入 juejin.cn 到看到页面:DNS、Nginx、服务器集群与 CDN 到底在做什么?
后端·mysql
东风破_9 小时前
从 0 设计一个博客数据库:用户、头像与文章表应该怎么建?
后端·mysql
大鸡腿同学10 小时前
黄仁勋点透的 AI 真相:能实现你知道但做不到的,却实现不了你不知道的
后端
FfHUCisI10 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI10 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
梦Arrebol11 小时前
Redis 内容及相关实验
数据库·redis
++==12 小时前
RESTful详解:核心思想、框架、与HTTP的区别,API的设计风格
后端·http·restful
IT_陈寒13 小时前
Vue的响应式更新有时候真的不听话
前端·人工智能·后端
只爱喝胡辣汤14 小时前
Redis Intset(整数集合)技术文档
redis