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中的CAS机制详解
java·开发语言
风筝在晴天搁浅3 小时前
hot100 78.子集
java·算法
故事和你914 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Leon-zy4 小时前
Redis7.4.5 主备冗余+哨兵模式部署
redis·哨兵模式·主备模式
Configure-Handler4 小时前
buildroot System configuration
java·服务器·数据库
:Concerto5 小时前
JavaSE 注解
java·开发语言·sprint
电商API_180079052475 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序6 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹6 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_949809596 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter