JAVA面试题:Redis分布式锁

Redis分布式锁

分布式锁使用的场景

集群情况下的定时任务,抢单,幂等性等场景

抢券场景

查询库存 -> 扣减库存

多个并发线程同时查询库存,出现超卖问题

添加互斥锁

所有线程执行操作之前必须尝试获取锁

保证一次只有一个线程能走查询库存->扣减库存的流程

Redis分布式锁实现原理

主要利用Redis的setnx(set if not exist)命令

redis 复制代码
set lock value nx ex 10
//获取锁
//设置过期时间防止获取锁时业务超时或服务宕机
redis 复制代码
del key
//释放锁

合理控制锁的有效时长

根据业务执行时间预估

加长锁的过期时间

给锁续期

使用redisson实现的分布式锁,基于setnx命令

watch dog

监控线程,监听持有锁的线程

加锁成功后每隔releaseTime/3的时间做一次续期

释放锁后通知watchdog

Redisson的获取锁方式

如果没有获取锁成功,会循环不断尝试获取锁直到超时

提高了分布式锁的可用性

Redisson实现的分布式锁--可重入

判断是否是同一个线程获取锁,如果是就可以成功获取

利用hash结构记录线程id和重入次数

key->线程名->重入次数

释放锁时会使锁的重入次数减一

Redisson实现分布式锁的主从一致性

RedLock:(实现繁琐,性能差)

在多个redis实例上创建锁(n/2+1)

n为redis节点数量

即超过redis实例的一半加锁

redis:AP思想:高可用性,最终一致

zookeeper:CP思想:强一致性

相关推荐
·薯条大王1 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO5 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆5 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光5 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林5 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu6 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
海上小飞龙6 小时前
Redis 分布式锁原理:从 SET NX EX 到 Redisson 看门狗
数据库·redis·分布式
AI人工智能+电脑小能手7 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官7 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1057 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计