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思想:强一致性

相关推荐
沉默-_-几秒前
MyBatis 学习笔记
java·开发语言·tomcat
未来龙皇小蓝2 分钟前
Spring内置常见线程池配置及相关概念
java·后端·spring·系统架构
Elias不吃糖3 分钟前
Java 常用数据结构:API + 实现类型 + 核心原理 + 例子 + 选型与性能(完整版)
java·数据结构·性能·实现类
会游泳的石头4 分钟前
构建企业级知识库智能问答系统:基于 Java 与 Spring Boot 的轻量实现
java·开发语言·spring boot·ai
澄风13 分钟前
Redis ZSet+Lua脚本+SpringBoot实战:滑动窗口限流方案从原理到落地
spring boot·redis·lua
说给风听.20 分钟前
Maven 配置实战:从环境搭建到 Idea 关联(超详细)
java·maven·intellij-idea
Hx_Ma1622 分钟前
SSM 项目中 mq是什么
java
生骨大头菜22 分钟前
对接金蝶上传附件接口
java·开发语言
skywalker_1122 分钟前
File:路径详述
java·开发语言·file
老友@28 分钟前
JMeter 在 Linux 环境下进行生产级性能压测的完整实战指南
java·linux·jmeter·性能优化·系统架构·压测·性能瓶颈