SpringBoot整合Redis实现分布式锁

SpringBoot整合Redis实现分布式锁

分布式系统为什么要使用分布式锁?

首先,分布式系统是由多个独立节点组成的,这些节点可能运行在不同的物理或虚拟机器上,它们通过网络进行通信和协作。在这样的环境中,多个节点可能同时尝试访问和修改共享资源,这就可能导致数据不一致和并发冲突的问题。

为了解决这个问题,分布式锁被引入作为一种同步机制。分布式锁能够在分布式系统中提供全局唯一的锁,确保在任意时刻只有一个节点能够访问和修改共享资源。当节点需要访问共享资源时,它必须先获取分布式锁,如果锁已经被其他节点持有,则当前节点需要等待或执行其他操作。只有当节点成功获取到锁后,才能对共享资源进行访问和修改。

此外,分布式锁还可以帮助实现一些复杂的分布式系统需求,如分布式事务、分布式缓存一致性等。通过使用分布式锁,我们可以更好地控制并发访问,保证数据的一致性和完整性,提高系统的可靠性和稳定性。

实现分布式锁需要考虑到多种因素,如锁的粒度、锁的公平性、锁的释放机制等。同时,由于分布式系统的复杂性和不确定性,分布式锁的实现也可能存在一些挑战和限制,如网络延迟、节点故障等问题都可能导致锁的行为变得复杂和难以预测。因此,在使用分布式锁时,我们需要根据实际情况进行权衡和选择,确保能够满足系统的需求并避免潜在的问题。

分布式系统使用分布式锁是为了实现资源的同步访问和并发控制,保证数据的一致性和完整性,提高系统的可靠性和稳定性。

redis配置类

package com.test.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @author TANGSHUAI* @version 1.0* @date 2023-06-09 10:58*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);//设置序列化Key的实例化对象redisTemplate.setKeySerializer(new StringRedisSerializer());//设置序列化Value的实例化对象redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}}

分布式锁工具类

package com.test.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;import java.util.Collections;
import java.util.concurrent.TimeUnit;/*** @author TANGSHUAI* @version 1.0* @date 2024-03-08 14:33*/
@Component
public class RedisDistributedLock {@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 尝试获取分布式锁** @param lockKey 锁* @param requestId 请求标识* @param expireTime 超期时间* @return 是否获取成功*/public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {return stringRedisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);}/*** 释放分布式锁** @param lockKey 锁* @param requestId 请求标识* @return 是否释放成功*/public boolean releaseDistributedLock(String lockKey, String requestId) {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +"return redis.call('del', KEYS[1]) " +"else " +"return 0 " +"end";Long result = stringRedisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class),Collections.singletonList(lockKey),requestId);System.out.println(result);return result.equals(1L);}
}

定时任务测试分布式锁

package com.test.service;import com.test.config.RedisDistributedLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/*** @author TANGSHUAI* @version 1.0* @date 2024-03-08 14:44*/
@Service
public class TestService {@Autowiredprivate RedisDistributedLock redisDistributedLock;@Scheduled(cron = "0/10 * * * * ?")//@Scheduled(cron = "0 10 16 * * ?")@Transactional(rollbackFor = Exception.class)public void testLock(){System.out.println("进入分布式锁方法");// 尝试获取分布式锁if (redisDistributedLock.tryGetDistributedLock("tangshuai", "123", 30)) {System.out.println("释放分布式锁");redisDistributedLock.releaseDistributedLock("tangshuai", "123");} else {// 未能获取到锁,可以选择重试或返回失败throw new RuntimeException("未能获取到锁,请重试");}}
}

分别启动两个相同的服务

package com.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;/*** @author TANGSHUAI* @version 1.0* @date 2023-06-08 17:04*/
@SpringBootApplication
@EnableScheduling
public class SaTokenDemoApp {public static void main(String[] args) {SpringApplication.run(SaTokenDemoApp.class, args);}
}

查看两个控制台打印情况,两个服务谁谁拿到锁,谁开始执行业务代码,没拿到锁的服务抛出异常

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合 1.Blend混合 // 正常&#xff0c;透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…

论文研读笔记1:

1.Improving Domain-Adapted Sentiment Classification by Deep Adversarial Mutual Learning&#xff1a; 1.1本篇论文提出了一种名为深度对抗性互学习&#xff08;Deep Adversarial Mutual Learning, DAML&#xff09;的新方法&#xff0c;用于改进领域适应性情感分类。 对…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

ComfyUI-Flowty-TripoSR

这是一个自定义节点&#xff0c;可让您直接从ComfyUI使用TripoSR。TripoSR 是由 Tripo AI 和 Stability AI 合作开发的最先进的开源模型&#xff0c;用于从单个图像快速前馈 3D 重建。&#xff08;TL;DR 它从图像创建 3d 模型。这篇文章主要介绍了将TripoSR作为ComfyUI节点的配…

Git 入门

Git 入门 版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 除了项目源代码&#xff0c;你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态&#xff…

JVM——执行引擎

文章目录 1、概述2、计算机语言的发展史2.1、机器码2.2、汇编语言2.3、高级语言2.4、字节码 3、Java代码编译和执行过程4、解释器5、JIT编译器5.1、为什么HotSpot VM同时存在JIT编译器和解释器5.2、热点代码探测确定何时JIT5.3、设置执行模式5.4、C1编译器和C2编译器 6、AOT编译…

想到2024年最有前景的副业创业机会?那这个项目你绝对不能错过!

大家好&#xff0c;我是电商花花。 现在看到别人要么都有自己的副业&#xff0c;要么都在做创业项目&#xff0c;你是不是也看的激情澎湃&#xff0c;想要做抖音小店&#xff0c;想要创业赚钱。 2024年做什么副业、创业有盼头&#xff1f;我觉得还得是抖音小店无货源这个电商…

【异常处理】sbt构建Chisel库时出现extracting structure failed:build status:error的解决办法

文章目录 报错背景&#xff1a;解决思路&#xff1a;①IDEA中配置本地的SBT进行下载②更改下载源为华为的镜像站1. 修改sbtconfig.txt2. 增加repositories文件 ③查看报错信息 总结整理的Scala-Chisel-Chiseltest版本信息对应表 报错背景&#xff1a; 最近在写Chisel时&#x…

机器学习--循环神经网络(RNN)1

一、简介 循环神经网络&#xff08;Recurrent Neural Network&#xff09;是深度学习领域中一种非常经典的网络结构&#xff0c;在现实生活中有着广泛的应用。以槽填充&#xff08;slot filling&#xff09;为例&#xff0c;如下图所示&#xff0c;假设订票系统听到用户说&…

【Pytorch】进阶学习:基于矩阵乘法torch.matmul()实现全连接层

【Pytorch】进阶学习&#xff1a;基于矩阵乘法torch.matmul()实现全连接层 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

sentinel docker 基础配置学习

1&#xff1a;去官网下载 Releases alibaba/Sentinel GitHub 2&#xff1a;保存到linux 3&#xff1a;编写dockerfile FROM openjdk:8-jreLABEL authors"xxx" #第二步创建一个文件夹Z RUN mkdir /app #第三步复制jar 到app 下 COPY xxxxxx-1.8.7.jar /app/#第四…

原油数据处理:1.聚类、盐含量测定与近红外光谱快速评估

一、原油种类的聚类分析 在塔里木盆地塔河油田的原油处理过程中&#xff0c;需要对原油进行地球化学特征研究&#xff0c;以了解其成因和特征。根据地球化学手段的综合研究结果&#xff0c;塔河油田奥陶系原油属于海相沉积环境&#xff0c;成熟度较高&#xff0c;正构烷烃分布…

有点NB的免费wordpress主题模板

一个不错的黄色模板&#xff0c;用WP免费主题模板搭建家政服务公司网站。 https://www.wpniu.com/themes/15.html

c++ 常用的STL

前言 写这篇博客目的是为了记录在刷算法题中使用过的STL&#xff0c;因为有些不太常用的会遗忘。这篇博客只是作为笔记&#xff0c;不是详细的STL&#xff0c;因此只会对常用方法说明&#xff0c;不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…

【linuxC语言】dup、dup2函数

文章目录 前言一、dup函数二、dup2函数三、将标准输出重定向到文件总结 前言 在Linux环境下&#xff0c;dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力&#xff0c;使得在多线程或多进程环境中更加安全和…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的SDI接收HLS多路视频融合叠加应用本方案…

华为设备小型园区网方案(有线+无线+防火墙)

&#xff08;一&#xff09;配置有线部分 1.配置LSW2 &#xff08;1&#xff09;创建相关vlan [LSW2]vlan batch 10 3000 &#xff08;2&#xff09;配置连接LSW1的Eth-Trunk1&#xff0c;透传VLAN 10 3000 [LSW2]int Eth-Trunk 1 [LSW2-Eth-Trunk1]port link-type trunk [LSW2…

STM32FreeRTOS任务通知(STM32cube高效开发)

文章目录 一、任务通知(一&#xff09;任务通知概述1、任务通知可模拟队列和信号量2、任务通知优势和局限性 (二) 任务通知函数1、xTaskNotify&#xff08;&#xff09;发送通知值不返回先前通知值的函数2、xTaskNotifyFromISR&#xff08;&#xff09;发送通知函数ISR版本3、x…

GitHub和Gitee的基本使用和在IDEA中的集成

文章目录 【1】GitHub1.创建仓库2.增加和修改文件3.创建分支4.删除仓库5.远程仓库下载到本地 【2】Gitee1.创建仓库2.远程仓库下载到本地. 【3】IDEA集成GitHub【4】IDEA集成Gitee1.在Gitee中修改&#xff0c;同步到本地2.从Gitee中下载项目 【1】GitHub 1.创建仓库 先登陆这…