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

Redisson实现分布式锁

在Spring Cloud项目中使用Redisson实现分布式锁可以帮助你在分布式系统中安全地管理共享资源。以下是一个详细的步骤,包括配置Redisson、集成到Spring Cloud项目中,以及使用分布式锁的示例代码。

1. 添加依赖

在你的Spring Cloud项目的pom.xml文件中添加Redisson的依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.4</version>
</dependency>

2. 配置Redisson

在Spring Cloud项目的application.yml文件中配置Redisson:

spring:redis:host: localhostport: 6379redisson:singleServerConfig:address: "redis://${spring.redis.host}:${spring.redis.port}"password: nulldatabase: 0

3. 配置Redisson客户端

创建一个Redisson配置类:

import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.spring.starter.RedissonAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://" + spring.redis.host + ":" + spring.redis.port);return Redisson.create(config);}
}

4. 使用Redisson分布式锁

在需要使用分布式锁的地方,可以通过注入RedissonClient来获取锁并使用它。以下是一个示例:

示例服务类
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class DistributedLockService {@Autowiredprivate RedissonClient redissonClient;public void executeWithLock() {RLock lock = redissonClient.getLock("myDistributedLock");boolean isLocked = false;try {// 尝试加锁,等待时间为10秒,上锁后10秒自动解锁isLocked = lock.tryLock(10, 10, TimeUnit.SECONDS);if (isLocked) {// 执行需要同步的操作System.out.println("Lock acquired, executing protected code");// 模拟业务逻辑处理Thread.sleep(5000);} else {System.out.println("Unable to acquire lock");}} catch (InterruptedException e) {e.printStackTrace();} finally {if (isLocked) {lock.unlock();System.out.println("Lock released");}}}
}
示例控制器类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LockController {@Autowiredprivate DistributedLockService distributedLockService;@GetMapping("/executeWithLock")public String executeWithLock() {distributedLockService.executeWithLock();return "Lock execution finished";}
}

5. 启动应用并测试

启动你的Spring Cloud应用,并访问/executeWithLock端点来测试分布式锁的使用。你可以多次访问该端点,观察锁的行为。

注意事项

  1. 锁的粒度:确保合理设计锁的粒度,避免过多的锁争用和死锁。
  2. 自动释放时间:确保锁的自动释放时间足够长,以覆盖最长的业务处理时间。
  3. 异常处理:在获取锁和业务处理过程中,要注意异常处理,确保在异常发生时能够释放锁。
  4. 高可用配置:在生产环境中,考虑使用Redis的高可用配置(如主从复制、哨兵模式、集群模式)以确保Redis服务的稳定性和可靠性。

通过以上步骤,你可以在Spring Cloud项目中使用Redisson实现分布式锁,从而在分布式环境中安全地进行资源竞争。

相关文章:

  • C语言 -- 宏的变长参数定义
  • kotlin lambda 表达式的原理、语法和详细用法
  • 专业纸箱厂:品质之选
  • JS 实现Date日期格式的本地化
  • Halcon 多相机统一坐标系
  • 2024年6月四六级考试复盘
  • 【Python】PySide6使用入门和注意事项
  • springboot整合sentinel接口熔断
  • 在线兴趣教学类线上学习APP应用开发部署程序组建研发团队需要准备什么?
  • js如何添加新元素到数组中
  • pytest中失败用例重跑
  • A5M2报错【列 pd.adsrc 不存在】
  • Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)
  • 企业微信发送消息
  • 基于Python的花卉识别分类系统【W9】
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CentOS从零开始部署Nodejs项目
  • co.js - 让异步代码同步化
  • HTTP中GET与POST的区别 99%的错误认识
  • Javascript设计模式学习之Observer(观察者)模式
  • JS数组方法汇总
  • oldjun 检测网站的经验
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • React组件设计模式(一)
  • 初识 beanstalkd
  • 利用DataURL技术在网页上显示图片
  • 每天一个设计模式之命令模式
  • 区块链分支循环
  • 写代码的正确姿势
  • 用 Swift 编写面向协议的视图
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #pragma once
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • .net6Api后台+uniapp导出Excel
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ C++ ] STL---string类的模拟实现
  • [ C++ ] 继承
  • [ 数据结构 - C++] AVL树原理及实现
  • [20171106]配置客户端连接注意.txt
  • [2023年]-hadoop面试真题(一)
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [c#基础]值类型和引用类型的Equals,==的区别