当前位置: 首页 > news >正文

27.Redisson基本使用和可重入性

基于setnx实现分布式锁存在下面问题

1.锁不可重入

同一个线程无法多次获取同一把锁。

2.不可重试

上一篇中实现的分布式锁是非阻塞式的,如果获取锁失败就立刻返回获取锁失败,不会重试获取锁。没有重试机制。

3.锁超时释放

虽然锁超时释放可以避免死锁,但如果是业务本身执行耗时较长,也会导致锁释放,存在安全隐患。

4.主从一致

如果redis是主从集群的,主从同步存在延迟,当主宕机时还没来得及方锁数据同步给从节点,那么其他线程就获取到了锁,造成线程安全问题。

Redisson

Redisson是一个基于redis基础上实现的java驻内存数据网格

提供了一系列分布式的java常用对象。

提供了许多分布式服务。其中就包括分布式锁

<!--redisson-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version>
</dependency>

package com.xkj.org.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author xiankejin* @descrition* @date 2025/10/15*/
@Configuration
public class RedisConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();//userSingleServer表示设置单节点,如果有密码设置.setPassword()//如果是redis集群地址使用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://192.168.19.128:6379");//创建redisson客户端对象返回return Redisson.create(config);}}
 /**解决方案:使用redisson */// 获取的锁是具有可重入性的,参数是指定锁的名称RLock lock = redissonClient.getLock("lock:order:" + userId);// 尝试获取锁,// 参数1:分别为获取锁的最大等待时间(期间会重试获取锁)可以不传,默认值为-1,表示获取锁失败立即返回,不等待。// 参数2,3:锁自动释放时间和单位,不传的情况,默认是30秒。// lock.tryLock(); 无参数的方法
//        boolean isLock = lock.tryLock(1, 10, TimeUnit.SECONDS);boolean isLock = lock.tryLock();if (!isLock) {//获取锁失败throw new ServiceException("有个用户只允许购买一单,不允许重复下单");}try {//调用Service类自己的方法,使用代理对象,否则事务失效//1.需要引入aspectjweaver的依赖//2.springboot启动类上添加注解暴露代理对象IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();VoucherOrder voucherOrder = proxy.createVoucherOrder(voucherId, userId);//6.返回订单idreturn voucherOrder.getId();} finally {//释放锁lock.unlock();}

redisson可重入锁的原理

key为锁名称,value为hash结构分别存入线程标识锁可重入的次数,当可重入次数减为0的时候,锁才会被删除。

http://www.dtcms.com/a/490180.html

相关文章:

  • 凡客做网站阎良网站建设公司
  • Uniapp微信小程序开发:全局变量的使用
  • 【优先队列介绍】
  • 初识HTNL
  • 笔试强训(四)
  • 【深入浅出PyTorch】--7.2.PyTorch可视化2
  • 商城系统-自动化测试报告
  • 递归-面试题08.06.汉诺塔问题-力扣(LeetCode)
  • 珠海网站建设 骏域网站域名 空间 网站制作
  • AI视频生成工具完全指南:从Sora到开源替代方案全解析
  • 多模态大模型研究每日简报【2025-10-16】
  • Azure Workbooks 权限配置完整指南
  • 公司做网站需要哪些资料百度蜘蛛抓取网站模块
  • 后端定义两个实体参数,前端如何传值
  • **点云处理:发散创新,探索前沿技术**随着科技的飞速发展,点云处理技术在计算机视觉、自动驾驶、虚拟现实等领域的应用愈发广
  • HarmonyOS分布式硬件共享:调用手机摄像头的手表应用
  • 网站开发英语英语山东教育网站开发公司
  • 手表东莞网站建设技术支持网站搭建公司加盟
  • DevTunnel:免费安全穿透内网网页
  • el-input 输入框宽度自适应宽度
  • [嵌入式系统-126]:CUDA运行在CPU上,还是运行在GPU之上?
  • 启动模板创建AWS EC2 Auto Scaling指南
  • 【LeetCode_160】相交链表
  • HUAWEI A800I A2 aarch64架构服务器鲲鹏920开启虚拟化功能
  • Java-151 深入浅出 MongoDB 索引详解 性能优化:慢查询分析 索引调优 快速定位并解决慢查询
  • 微信小程序快速入门【02】
  • YOLO-V1 与 YOLO-V2 技术详解:从经典到优化的目标检测演进
  • 天津市网站制作公司百度seo点击器
  • 建设部网站燃气管理部门网络软件开发
  • 三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树