使用Spring Boot实现分布式锁

使用Spring Boot实现分布式锁

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

1. 什么是分布式锁?

分布式系统中,由于多个节点并行处理任务,为了保证数据的一致性和避免资源竞争,需要一种机制来控制对共享资源的访问。分布式锁就是一种用来在分布式环境下控制并发访问的机制,确保同一时刻只有一个节点可以获取锁。

2. 使用Redis实现分布式锁

Redis是一个高性能的key-value存储系统,常用于分布式锁的实现。在Spring Boot项目中,我们可以借助Redis来实现分布式锁。

3. 示例:基于Redis的分布式锁实现

首先,确保在Spring Boot项目中添加以下依赖:

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

接下来,我们编写一个工具类来实现基于Redis的分布式锁:

package cn.juwatech.distributedlockexample;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class RedisDistributedLock {@Autowiredprivate RedisTemplate<String, String> redisTemplate;public boolean tryLock(String key, String value, long expireTime) {Boolean success = redisTemplate.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.MILLISECONDS);return success != null && success;}public void unlock(String key, String value) {String currentValue = redisTemplate.opsForValue().get(key);if (currentValue != null && currentValue.equals(value)) {redisTemplate.delete(key);}}
}

在上述示例中:

  • 我们定义了一个RedisDistributedLock类,使用了Spring Boot提供的RedisTemplate来操作Redis。
  • tryLock方法尝试获取锁,使用Redis的setIfAbsent方法设置键值对,如果键不存在则设置成功,表示获取锁成功。
  • unlock方法释放锁,先获取当前锁的值,如果与传入的值相等,则删除锁。

4. 使用示例

接下来,我们演示如何在服务中使用这个分布式锁:

package cn.juwatech.distributedlockexample;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LockController {@Autowiredprivate RedisDistributedLock redisDistributedLock;@GetMapping("/lock/{key}/{value}")public String lock(@PathVariable("key") String key, @PathVariable("value") String value) {boolean result = redisDistributedLock.tryLock(key, value, 30000); // 锁定30秒return result ? "Lock acquired successfully!" : "Failed to acquire lock!";}@GetMapping("/unlock/{key}/{value}")public String unlock(@PathVariable("key") String key, @PathVariable("value") String value) {redisDistributedLock.unlock(key, value);return "Lock released!";}
}

在上述示例中:

  • 我们定义了一个LockController类,包含两个接口:/lock/{key}/{value}用于获取锁,/unlock/{key}/{value}用于释放锁。
  • 调用redisDistributedLock.tryLock方法获取锁,并指定了锁的过期时间为30秒。
  • 调用redisDistributedLock.unlock方法释放锁。

5. 总结

本文详细介绍了如何使用Spring Boot结合Redis实现分布式锁的方法和示例。通过使用Redis作为分布式锁的存储介质,我们可以在分布式环境中安全地实现对共享资源的访问控制。

著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

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

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

相关文章

[crypt]-异或-异性相吸

压缩包两个文件&#xff0c;一个key&#xff0c;一个密文。 打开密文是乱码&#xff0c;使用16进制查看&#xff0c;一串数字&#xff0c;和key转换为bytes逐位异或。得到flag 开始以为是键盘密码&#xff0c;qeasdf,左上角区域 #异性相吸 xor keyasadsasdasdasdasdasdasdas…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…

制造业ERP源码 ERP系统源码 ERP小程序源码

制造业ERP源码 ERP系统源码 ERP小程序源码 资料&#xff1a; 委外工厂管理 客户列表 车间管理 供应商管理 账户管理 商品管理 仓库管理 职员管理 自取地址管理 司机管理 辅助资料 客户等级 供应商分类 客户分类 商品分类 支出类别管理 收入类别管…

Go语言入门之变量、常量、指针以及数据类型

Go语言入门之变量、常量、指针以及数据类型 1.变量的声明和定义 var 变量名 变量类型// 声明单变量 var age int // 定义int类型的年龄&#xff0c;初始值为0// 声明多变量 var a, b int 1, 2// 声明变量不写数据类型可以自动判断 var a, b 123, "hello"// 变…

uniapp使用多列布局显示图片,一行两列

完整代码&#xff1a; <script setup>const src "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg" </script><template><view class"content"><view class"img-list"><image :src"src…

使用YOLO5进行模型训练机器学习【教程篇】

准备工作 YOLOv5 是目前非常流行的目标检测模型,广泛应用于各种计算机视觉任务,可以检测到图片中的具体目标。 我们借助开源的模型训练框架,省去了自己写算法的步骤,有技术的伙伴可以深入了解并自己写算法训练。 电脑要求: GPU ,内存 >12G python > =3.8 windows o…

KnoBo:医书学习知识,辅助图像分析,解决分布外性能下降和可解释性问题

KnoBo&#xff1a;从医书中学习知识&#xff0c;辅助图像分析&#xff0c;解决分布外性能下降问题 提出背景KnoBo 流程图KnoBo 详解问题构成结构先验瓶颈预测器参数先验 解法拆解逻辑链对比 CLIP、Med-CLIPCLIPMed-CLIPKnoBo 训练细节预训练过程OpenCLIP的微调 构建医学语料库文…

Flutter RSA公钥转PEM

需添加依赖&#xff1a;pointycastle​​​​​​​ 参考链接&#xff1a;https://github.com/bcgit/pc-dart/issues/165 import dart:convert; import dart:typed_data;import package:pointycastle/pointycastle.dart; import package:pointycastle/src/platform_check/pl…

【并发编程】CPU IO 密集型

CPU-bound&#xff08;计算密集型&#xff09;和I/O-bound&#xff08;I/O密集型&#xff09;是描述程序性能瓶颈的两种常见类型。CPU-bound程序的性能主要受限于CPU的处理速度&#xff0c;它们需要执行大量的计算任务。而I/O-bound程序的性能则主要受限于I/O操作的速度&#x…

【经典面试题】是否形成有环链表

1.环形链表oj 2. oj解法 利用快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

前端练习小项目——方向感应名片

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的小项目为——方向感应名片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习之前&#xff0c;先让我们看一…

Java中的代理机制

代理的概述 代理&#xff1a;给目标对象提供一个代理对象&#xff0c;并且由代理对象控制着对目标对象的引用&#xff08;跟多态一样&#xff09; mybatis、spring都运用了代理机制 跳过创建类的过程&#xff0c;直接产生对象 简单来说&#xff0c;我们使用代理对象来代替对…

数据建设实践之大数据平台(四)安装mysql

安装mysql 卸载mysql [bigdatanode101 ~]$ sudo rpm -qa | grep mariadb | xargs sudo rpm -e --nodeps 上传安装包到/opt/software目录并解压 [bigdatanode101 software]$ tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C mysql_lib/ 到mysql_lib目录下顺序安装 …

【Python】日期和时间模块

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言时间元组datetime 模块datetime类获取当前日期和时间 timedelta类日期和时间运算 strftime()方法格式化时间日期格式化符号 strptime()方法 Time 模块Time 模块内置函数Time 模…

编译适用于 Apple Silicon Macs 的 Chromium 教程

本教程将指导你如何在 Apple Silicon Macs 上编译 Chromium&#xff0c;包括所需的系统要求、工具安装、源码获取、环境配置、编译和运行步骤。 一、系统要求 Apple Silicon Mac&#xff08;如 M1、M2&#xff09;。安装 Xcode 和 macOS SDK&#xff08;通过 App Store 安装最…

AWDAWFAAFAWAWFAWF

创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09; 创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称 创建视图v_dept_emp_count(dept…

Ubuntu使用Nginx部署uniapp打包的项目

使用uniapp导出web项目&#xff1a; 安装&#xff1a; sudo apt install nginx解压web.zip unzip web.zip移动到/var/www/html目录下&#xff1a; sudo cp -r ~/web/h5/ /var/www/html/重启Nginx&#xff1a; sudo service nginx restart浏览器访问&#xff1a;http://19…

基于深度学习的情感分析

基于深度学习的情感分析是一种利用深度学习技术从文本数据中提取情感信息&#xff0c;判断文本的情感倾向&#xff08;如正面、负面或中性&#xff09;的方法。这项技术在市场营销、客户服务、社交媒体分析、产品评价和政治分析等领域有广泛应用。以下是对这一领域的系统介绍&a…

Java高频面试基础知识点整理4

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

iOS热门面试题(三)

面试题1&#xff1a;在iOS开发中&#xff0c;什么是MVC设计模式&#xff1f;请详细解释其各个组成部分&#xff0c;并给出一个实际应用场景&#xff0c;包括具体的代码实现。 答案&#xff1a; MVC设计模式是一种在软件开发中广泛使用的架构模式&#xff0c;特别是在iOS开发中…