redisson分布式锁的单机版应用

package com.redis;/*** @author linn* @date 2024年04月23日 15:31*/
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;@Configuration
public class RedissonConfig {@Bean(destroyMethod="shutdown")public RedissonClient redissonClient() {Config config = new Config();config.setLockWatchdogTimeout(2000);config.setNettyThreads(5);config.setKeepPubSubOrder(true);config.setMaxCleanUpDelay(2000);config.setMinCleanUpDelay(200);config.setThreads(5);config.useSingleServer().setAddress("redis://127.0.0.1:6379");return Redisson.create(config);}
}
RedissonConfig配置类如上:

以下是测试类:

package com.redis;/*** @author linn* @date 2024年04月23日 16:09*/
import com.DemoApplication;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;/*** @ClassName RedissonTest* @Description Redisson测试用例* @Author 阿Q* @Date 2022/11/26*/
@Slf4j
@SpringBootTest(classes = DemoApplication.class)
public class RedissonTest {@Resourceprivate RedissonClient redissonClient;@Resourceprivate ThreadPoolTaskExecutor executor;// redisson分布式锁的keyprivate static final String LOCK_TEST_KEY = "redisson:lock:test";private static final String LOCK_TITLE = "redisLock_";int n = 500;/*** 分布式锁测试用例*/@Testpublic void lockTest() {// 利用 循环+多线程 模仿高并发请求for (int i = 0; i < 10; i++) {executor.execute(() -> {// 这里获取公平锁,遵循先进先出原则,方便测试RLock fairLock = redissonClient.getFairLock(LOCK_TEST_KEY);try {// 尝试加锁// waitTimeout 尝试获取锁的最大等待时间,超过这个值,则认为获取锁失败// leaseTime   锁的持有时间,超过这个时间锁会自动失效(值应设置为大于业务处理的时间,确保在锁有效期内业务能处理完)boolean lock = fairLock.tryLock(3000, 30, TimeUnit.MILLISECONDS);if (lock){log.info("线程:" + Thread.currentThread().getName() + "获得了锁");log.info("剩余数量:{}", --n);}} catch (InterruptedException e) {e.printStackTrace();} finally {log.info("线程:" + Thread.currentThread().getName() + "准备释放锁");// 注意,无论出现任何情况,都要主动解锁fairLock.unlock();}});}try {// ->_-> 这里使当前方法占用的线程休息10秒,不要立即结束Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}//加锁public boolean acquire(String lockName) {//声明key对象String key = LOCK_TITLE + lockName;//获取锁对象RLock mylock = redissonClient.getLock(key);//加锁,并且设置锁过期时间3秒,防止死锁的产生  uuid+threadIdmylock.lock();boolean flag = mylock.isLocked();//加锁成功return true;}//锁的释放public void release(String lockName) {//必须是和加锁时的同一个keyString key = LOCK_TITLE + lockName;//获取所对象RLock mylock = redissonClient.getLock(key);//释放锁(解锁)mylock.unlock();System.out.println("释放锁成功!"+key);}@Testpublic void releaseTest(){acquire("test_lock");release("test_lock");}
}

properties的配置类:

redisson.config=classpath:redisson.yaml

 redisson.yaml配置类如下:

# 单一 Redis 服务器模式
singleServerConfig:# Redis 服务器的地址address: "redis://127.0.0.1:6379"# 连接池的大小connectionPoolSize: 64# Redis 服务器的密码password:# Redis 数据库索引database: 0# 客户端名称clientName:# 超时时间,单位为毫秒timeout: 3000# Redis 命令失败重试次数retryAttempts: 3# 两次命令之间重试的时间间隔,单位为毫秒retryInterval: 1500# 发布和订阅的连接的最小数量subscriptionConnectionMinimumIdleSize: 1# 发布和订阅的连接池的大小subscriptionConnectionPoolSize: 50# 当前处理 Redis 命令的线程共享的联接connectionMinimumIdleSize: 10# 集群模式的配置 (需要注释或删除 singleServerConfig 当使用此模式)
#clusterServersConfig:
#  scanInterval: 2000
#  slaveConnectionPoolSize: 64
#  slaveConnectionMinimumIdleSize: 24
#  masterConnectionPoolSize: 64
#  masterConnectionMinimumIdleSize: 24
#  readMode: "SLAVE"
#  nodeAddresses:
#    - "redis://127.0.0.1:7001"
#    - "redis://127.0.0.1:7002"
#    - "redis://127.0.0.1:7003"
#  password: "your_password"# 其他模式,如 sentinel, masterSlave, replicated 可以在这里配置,但确保只有一个模式处于未注释状态# 线程工厂配置
threads: 16
nettyThreads: 32# 编解码器配置,默认是 Jackson
codec: !<org.redisson.codec.JsonJacksonCodec> {}# 传输模式,默认是 NIO
transportMode: "NIO"

pom.xml配置文件:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.10.5</version></dependency>

应用到自己项目中的截图如下:

finally释放锁:

 redisson加的锁和普通redis.setnx不同,数据结构不同:

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

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

相关文章

怎样压缩jpg文件体积?分享一个极速压缩的方法

在工作中我们经常会遇到图片体积过大需要压缩处理。想要快速压缩jpg格式体积还不想下载软件要怎么操作呢&#xff1f;下面&#xff0c;给大家分享一款小白也能轻松使用的Jpg压缩&#xff08;https://www.yasuotu.com/&#xff09;工具-压缩图。支持上传单张100M以内&#xff0c…

常见大厂面试题(SQL)01

知乎问答最大连续回答问题天数大于等于3天的用户及其对应等级 1.描述 现有某乎问答创作者信息表author_tb如下(其中author_id表示创作者编号、author_level表示创作者级别&#xff0c;共1-6六个级别、sex表示创作者性别)&#xff1a; author_id author_level sex 101 …

命令行vue-cli-service不是内部或外部命令

没有安装vue/cli-service导致的 npm install -g vue/cli-service

背靠TON公链的Notcoin游戏项目,能否杀出GameFi的红海?

4月15日消息&#xff0c;Telegram生态中的游戏及Meme项目Notcoin&#xff0c;最近在X平台公布了令市场瞩目的代币经济学方案。据悉&#xff0c;NOT的总供应量高达1027亿枚&#xff0c;其中78%将分配给矿工和Voucher持有者&#xff0c;余下的22%预留给未来新用户、交易者及各类上…

MAC用户福利:一站式电商客服工具下载地址大全揭秘!

列举和比较拼多多商家版,阿里卖家MAC版本&#xff0c;京麦工作台&#xff0c;聊天宝MAC版&#xff0c;千牛MAC版&#xff0c;抖店MAC版各种适用于MAC系统的电商客服工具&#xff0c;提供平台MAC版本的下载地址&#xff0c;帮助用户提高客服效率、改善客户体验&#xff0c;从而提…

ROS通信模式/动作编程(设置收发节点,使小海龟移动到指定位置)

声明&#xff1a;本文转载&#xff0c;自己进行微微改动方便自己观看&#xff0c;有需要可以看原作者点击这里跳转 一、话题、服务模式编程 1.1 创建工作空间 输入以下三条命令&#xff1a; mkdir -p ~/comm_ws/src cd ~/comm_ws/src catkin_init_workspace编译工作空间&…

了解MySQL InnoDB多版本MVCC(Multi-Version Concurrency Control)

了解MySQL InnoDB多版本MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高…

U盘乱码频发,原因与解决方案大揭秘

在日常的工作和生活中&#xff0c;U盘因其便携性和大容量成为了我们不可或缺的存储设备。然而&#xff0c;有时候我们会遭遇U盘乱码的问题&#xff0c;这让我们无法正确读取和使用其中的文件。那么&#xff0c;U盘乱码究竟是何原因导致的呢&#xff1f;又该如何解决这一问题呢&…

如何诊断并解决PostgreSQL中的磁盘空间不足问题?

文章目录 诊断磁盘空间不足问题1. 检查服务器磁盘空间2. 检查PostgreSQL数据目录大小3. 检查PostgreSQL中的大表和大对象 解决磁盘空间不足问题1. 清理不必要的文件和日志2. 清理或压缩大表和大对象3. 扩展磁盘容量4. 优化数据库配置和查询 在使用PostgreSQL数据库时&#xff0…

android studio 设备框 一直显示灰色 loading devices 解决办法

问题&#xff1a; 解决办法&#xff1a; 把sdk manger自动下载的platform-tools删除。然后去谷歌官网下载老版本的platform-tools&#xff0c;然后解压&#xff0c;放刚才删掉的地方即可 这里我给出2个 最新可用老版本下载地址&#xff1a;https://dl.google.com/android/repo…

华为机考入门python3--(18)牛客18- 识别有效的IP地址和掩码并进行分类统计

分类&#xff1a;字符串 知识点&#xff1a; 字符串是否由数字组成 my_str.isdigit() 字符串填充 不足8位左侧填充0 my_str.zfill(8) 题目来自【牛客】 import sys def classify_ip(ip_mask): ip_class, is_private_ip, mask_class ignore_ip, 0, valid_mask# 解…

QT中对于QPushButton样式的调整

文章目录 前言1.QPushButton1.1 新建项目导入资源1.2 添加Push Button并定义样式1.3 调整样式1.4 实际需求情况1.5 背景色和边框 2. 一些概念理解2.1 图片2.2 边距 总结 前言 前段时间在调软件的样式&#xff0c;学到了些新的东西&#xff0c;也碰到了些问题&#xff0c;这里做…