如何实现Redisson分布式锁

首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现

Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。

Redisson:其实就是相当于在redis的基础上进行了加强,让redisson不像redis的分布式是直接基于指令setnx(set if not exists: 如果不存在)去实现的。

开始配置

因为redission是基于redis的,所以我们需要本地安装reids,redis安装这里就不演示了,这里是使用springboot创建的项目,我们默认项目已经创建完成了,所以直接开始配置

项目结构

1、配置redis

#以下是application.yml中的配置
server:port: 8083spring:redis:host: localhostport: 6379timeout: 1000jedis:pool:min-idle: 5max-idle: 10max-wait: -1
2、配置pom.xml 引入相关jar包
        <!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 引入redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.7</version></dependency>
3、编写测试并发类
package cn.sendmsg.test;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class redissonController {@RequestMapping("/testLock")public void  testRedissLock(){// 使用Redisson 设置分布式锁//1、配置Redisson客户端  Config对象用于配置 Redisson 客户端的参数。Config config = new Config();//2、连接地址    连接方式redis://  或者 rediss://// 集群使用// config.useClusterServers()//    .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒//    //可以用"rediss://"来启用SSL连接//    .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")//    .addNodeAddress("redis://127.0.0.1:7002");/**  userSingleServer():指定使用单个redis服务配置*  setAddress() :  设置 Redis 服务器的地址*  setPassWord(): 设置连接 Redis 服务器的密码,如果有的话*  setDatabase(0): 设置连接的数据库索引,0就表示第一个* */config.useSingleServer().setAddress("redis://localhost:6379");//3、 创建Redisson客户端RedissonClient redissonClient = Redisson.create(config);String lockValue = "isLock";// 获取红锁RLock redissonLock = redissonClient.getLock(lockValue);try {// 后去锁,如果获取到返回true// tryLock():尝试3秒内获取锁,如果获取到了,最长3秒自动释放boolean lock = redissonLock.tryLock(3L,3L, TimeUnit.SECONDS);// 获取锁后,开始执行需要加锁的逻辑代码if(lock){System.out.println("获取到锁了");for(int i =0;i<5;i++){log.info("执行逻辑,查看打印结果:{}",i);}}} catch (InterruptedException e) {log.info("获取锁失败,失败原因:{}",e.getMessage());throw new RuntimeException(e);}finally {// 最后一定要释放锁,不然有可能造成死锁现象redissonLock.unlock();}}// 用于jmater测试不加锁的信息,对比看@RequestMapping("/testNoLock")public void  testRedissNoLock(){for(int i =0;i< 10;i++){log.info("无分布式锁的逻辑:"+i);}}}
4、使用jmater测试(这是个压测工具,可以一次性发多个线程,来进行压力测试),这个自行安装以下

以下是jmater工具页面截图,这个花3分钟时间,自己学习下,主要还是设置yml、pom.xml、测试类,这个属于工具

 5、查看本地代码运行结果(注意看打印结果,因为获得了分布式锁,所以在执行代码块for循环时,是顺序的,不然不是顺序的)
获取到锁了
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4

到这里,其实我们就已经实现Redisson分布式锁了,不要把这个想的太复杂,可能在集群时需要注意些。  示例代码中演示了集群时如何设置。这是一个简单的案例,但实际开发者,获取锁-释放锁也是这么用的。加油

6、不加锁使用jmater打印的信息

不加锁,for循环打印时,输出日志就不是有顺序的

15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.081  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.078  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.210  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.211  INFO 40508 --- [io-8083-exec-26] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/196585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习第4天:模型优化方法—梯度下降

文章目录 前言 梯度下降原理简述 介绍 可能的问题 批量梯度下降 随机梯度下降 基本算法 存在的问题 退火算法 代码演示 小批量梯度下降 前言 若没有机器学习基础&#xff0c;建议先阅读同一系列以下文章 机器学习第1天&#xff1a;概念与体系漫游-CSDN博客 机器学习…

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS 16.2.2 PPDU format16.2.2.1 General16.2.2.2 Long PPDU format16.2.2.3 Short PPDU format 16.3.4 HR/DSSS TXTIME calculation PREV&#xff1a; TBD NEXT&#xff1a; TBD 16.2.2 PPDU format 16.2.2.1 General 定…

五分钟,Docker安装kafka 3.5,kafka-map图形化管理工具

首先确保已经安装docker&#xff0c;如果是windows安装docker&#xff0c;可参考 wsl2安装docker 1、安装zk docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:218…

各类软件docker安装

docker Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本&#xff1a; uname -r 3.10.0-1062.1.2.el7.x86_64 安装 Docker&#xff1a; 安装 Docker&#xff1a;yum -y install dockerkafka和zookeeper docker pull wurstmei…

【RH850芯片】RH850U2A芯片平台Spinlock的底层实现

目录 前言 正文 1.RH850U2A上的原子操作 1.1 Link 1.2 Link generation 1.3 Success in storing 1.4 Failure in storing 1.5 Condition for successful storing 1.6 Loss of the link 1.7 示例代码 2.Spinlock代码分析 2.1 尝试获取Spinlock 2.2 释放Spinlock …

Vue前端添加水印功能

文章目录 概要技术细节附上几张调整的结果图 概要 前端Vue在页面添加水印&#xff0c;且不影响页面其他功能使用&#xff0c;初级代码水准即可使用&#xff0c;且有防人修改或者删除功能&#xff01; 提示&#xff1a;适用于Vue&#xff0c;组件已经封装开箱即用&#xff0c;有…

OpenHarmony应用开发入门教程(一、开篇)

前言 华为正式宣布2024年发布的华为鸿蒙OS Next版将不再兼容安卓系统。这一重大改变&#xff0c;预示着华为鸿蒙OS即将进入一个全新的阶段。 都说科技无国界&#xff0c;这是骗人的鬼话。谷歌的安卓12.0系统早已发布&#xff0c;但是自从受到美影响&#xff0c;谷歌就拒绝再向…

CAD长方形纤维插件2D

插件介绍 CAD长方形纤维插件2D版本可用于在AutoCAD软件内生成随机分布的长方形纤维图形&#xff0c;生成的dwg格式模型可用于模拟二维随机分布的纤维复合材料、随机初始裂缝等&#xff0c;同时模型可导入COMSOL、Abaqus、ANSYS、Fluent等有限元软件内进行仿真分析计算。 插件…

【算法萌新闯力扣】:找到所有数组中消失对数字

力扣热题&#xff1a;找到所有数组中消失对数字 开篇 这两天刚交了蓝桥杯的报名费&#xff0c;刷题的积极性高涨。算上打卡题&#xff0c;今天刷了10道算法题了&#xff0c;题目都比较简单&#xff0c;挑选了一道还不错的题目与大家分享。 题目链接:448.找到所有数组中消失对…

(二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据集二、导入数据以及展示部分1.导入数据集以及对数据集进行处理2.展示数据&#xff08;看看就好&#xff09; 三&#xff08;1&#xff09;、搭建网络进…

ubuntu 20.04安装 Anaconda教程

在安装Anaconda之前需要先安装ros(防止跟conda冲突&#xff0c;先装ros)。提前安装好cuda 和cudnn。 本博客参考&#xff1a;ubuntu20.04配置ros noetic和cuda&#xff0c;cudnn&#xff0c;anaconda&#xff0c;pytorch深度学习的环境 安装完conda后&#xff0c;输入: pyth…

Flink(六)【DataFrame 转换算子(下)】

前言 今天学习剩下的转换算子&#xff1a;分区、分流、合流。 每天出来自学是一件孤独又充实的事情&#xff0c;希望多年以后回望自己的大学生活&#xff0c;不会因为自己的懒惰与懈怠而悔恨。 回答之所以起到了作用&#xff0c;原因是他们自己很努力。 …

人工智能基础_机器学习036_多项式回归升维实战3_使用线性回归模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0076

首先我们拿到双十一从2009年到2018年的数据 可以看到上面是代码,我们自己去写一下 首先导包,和准备数据 from sklearn.linear_model import SGDRegressor import numpy as np import matplotlib.pyplot as plt X=np.arange(2009.2020)#左闭右开,2009到2019 获取从2009到202…

MIKE水动力笔记20_由dfs2网格文件提取dfs1断面序列文件

本文目录 前言Step 1 MIKE Zero工具箱Step 2 提取dfs1 前言 在MIKE中&#xff0c;dfs2是一个一个小格格的网格面的时间序列文件&#xff0c;dfs1是一条由多个点组成的线的时间序列文件。 如下两图&#xff1a; 本博文内容主要讲如何从dfs2网格文件中提取dfs1断面序列文件。 …

CI/CD -gitlab

目录 一、常用命令 二、部署 一、常用命令 官网&#xff1a;https://about.gitlab.com/install/ gitlab-ctl start # 启动所有 gitlab 组件 gitlab-ctl stop # 停止所有 gitlab 组件 gitlab-ctl restart # 重启所有 gitlab 组件 gitlab-ctl statu…

linux进程间通信之信号

摘要 本文旨在研究Linux进程间通信的机制之一&#xff1a;信号。信号是由操作系统来处理的&#xff0c;说明信号的处理在内核态。信号不一定会立即被处理&#xff0c;此时会储存在信 号的信号表中。最后&#xff0c;我们会对这种通信方式的优缺点进行全面的分析&#xff0c;并给…

C++ opencv基本用法【学习笔记(九)】

这篇博客为修改过后的转载&#xff0c;因为没有转载链接&#xff0c;所以选了原创 文章目录 一、vs code 结合Cmake debug1.1 配置tasks.json1.2 配置launch.json 二、图片、视频、摄像头读取显示2.1 读取图片并显示2.2 读取视频文件并显示2.3 读取摄像头并写入文件 三、图片基…

设计模式-行为型模式-责任链模式

一、什么是责任链模式 责任链模式是一种设计模式。在责任链模式里&#xff0c;很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递&#xff0c;直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求&…

Spring Security OAuth2.0 实现分布式系统的认证和授权

Spring Security OAuth2.0 实现分布式系统的认证和授权 1. 基本概念1.1 什么是认证&#xff1f;1.2 什么是会话&#xff1f;1.2.1 基于 session 的认证方式1.2.2 基于 token 的认证方式 1.3 什么是授权&#xff1f;1.3.1 授权的数据模型 1.4 RBAC 介绍 2. Spring Security2.1 S…

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6

前言 我个人项目中&#xff0c;不想使用太重的数据库&#xff0c;而内嵌数据库中SQLite又是最受欢迎的&#xff0c; 因此决定采用这个数据库。 可是JPA并不支持Sqlite&#xff0c;这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异&#xff0c; 但是…