美畅物联丨分布式锁实战:Spring Boot项目中的Redis应用

在分布式系统里,多个节点或许会同时对共享资源进行访问与操作。为防止出现数据不一致、资源竞争等状况,就需要一种机制来对这些并发访问加以协调,于是分布式锁就出现了。它如同一把全局的钥匙,在同一时刻仅有一个节点能够获取该钥匙以访问共享资源,进而确保了数据的一致性以及系统的稳定性。

在Spring Boot应用里,利用Redis达成分布式锁是一种常见的操作方式,Redis提供了简洁且有效的机制以实现该功能。

以下为在Spring Boot中运用Redis实现分布式锁的步骤:

一、搭建 Spring Boot 项目并引入 Redis 依赖

1、创建 Spring Boot 项目

(1)利用Spring Initializr创建一个Spring Boot项目。在项目配置期间,挑选合适的Spring Boot版本,一般推荐使用稳定版本。

要确保添加Web依赖,因为在Web服务中我们通常会使用分布式锁来保护共享资源。此外,添加Redis依赖,这会让我们在项目中便捷地使用Redis相关功能。

(2)检查项目结构与配置文件

在生成的项目结构里,pom.xml(针对Maven项目)或者build.gradle(针对Gradle项目)属于项目构建文件,其作用是管理项目的依赖关系。

src/main/java目录是用于编写Java代码的地方,src/main/resources目录则用于存放配置文件、静态资源等。

2、配置 Redis 连接

(1)在application.properties或者application.yml中进行配置。

若使用application.properties文件,则添加如下配置:

properties
spring.redis.host=localhostspring.redis.port=6379

(2)这里假定Redis服务在本地运行,其主机名是localhost,端口为6379。若Redis服务受密码保护,那么还需添加spring.redis.password配置项。

若采用application.yml文件,配置如下:

yaml
spring:
  redis:
    host: localhost
    port: 6379

这种配置方式更为直观,具有清晰的层次结构。同样地,若存在密码,也能够在password(密码)字段添加密码信息。

二、实现 Redis 分布式锁的基本步骤

1、注入 RedisTemplate

在需要运用分布式锁的类里注入RedisTemplate。

在Spring Boot框架下,RedisTemplate属于操作Redis的核心类。在服务类或者相关业务逻辑类当中,借助@Autowired注解来注入RedisTemplate。

java
import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;@Servicepublic class MyService {
    private final RedisTemplate<String, Object> redisTemplate;
    @Autowired
    public MyService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    // 以下是使用分布式锁的业务逻辑}

在这里,把RedisTemplate注入到MyService类里,以便于在这个类之后的业务逻辑当中,运用Redis操作达成分布式锁。

2、获取分布式锁

利用Redis的SETNX命令达成锁获取

在MyService类里,编写一个用于获取分布式锁的方法。能够借助RedisTemplate的opsForValue方法来操作Redis中的字符串类型数据,该方法对应SETNX(SET if Not eXists)命令,此命令的作用是当键不存在时设置键值。

java
public boolean tryLock(String lockKey, long expireTime) {
    Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked");
    if (result!= null && result) {
        // 设置锁的过期时间,防止死锁
        redisTemplate.expire(lockKey, expireTime, TimeUnit.SECONDS);
        return true;
    }
    return false;}

此方法接收两个参数,其中lockKey为用于标识锁的唯一键,expireTime则是锁的过期时间(单位为秒)。首先尝试获取锁,若键不存在(也就是说当前没有其他节点持有该锁),便将键值设为locked,并且返回true以表明获取锁成功。接着设置锁的过期时间,如此一来,即便持有锁的节点发生故障,锁也会在一段时间后自动释放,从而避免了死锁状况。若获取锁失败(键已经存在),则返回false。

3、释放分布式锁

利用Redis的DEL命令达成锁的释放

编写一个用于释放分布式锁的方法,同样借助RedisTemplate进行操作。

java
public void unlock(String lockKey) {
    redisTemplate.delete(lockKey);}

这个方法十分简单,利用redisTemplate.delete方法删除相应的锁键,进而释放锁。但在实际应用时,必须注意确保只有持有锁的节点才能够释放锁,防止误将其他节点持有的锁释放。

三、注意事项

1、锁的过期时间:要确保设定合理的锁过期时间,防止由于某些原因(例如服务器宕机)致使锁无法释放。

2、重试机制:运用Spring Retry或者其他重试机制来处理锁获取失败的状况。

3、锁的唯一性:要保证锁键具有唯一性,以免不同业务逻辑发生冲突。

4、性能考量:分布式锁会带来一定的性能损耗,在高并发场景下尤其需要谨慎使用。

通过以上步骤,我们可以在 Spring Boot 项目中有效地使用 Redis 实现分布式锁,保护共享资源,确保分布式系统的稳定运行和数据一致性。不过,在实际应用中,还需要根据具体的业务场景和系统架构进行更多的优化和调整。

————————————————

关注“美畅物联”,了解更多视频汇聚及AIoT底座解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…

从RNN到Transformer:生成式AI自回归模型的全面剖析

个人主页&#xff1a;chian-ocean 文章专栏 生成式AI中的自回归模型详解 在生成式AI的飞速发展中&#xff0c;自回归模型作为核心技术之一&#xff0c;成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用&#xff0c;并结合…

「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台

本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲&#xff0c;并查看当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度&#xff0c;是音乐播放器界面开发的基础功能示例。 关键词 UI互动应用音乐控制播放控制动态展示状态管理按钮…

用QT制作的倒计时软件

一、pro代码 RC_ICONS countdown.ico 二、mainwindow.cpp代码 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QDateTime> #include <QMessageBox> #include <QSettings>MainWindow::MainWindow(QWidget *parent): QM…

Unbuntu下怎么生成SSL自签证书?

环境&#xff1a; WSL2 Unbuntu 22.04 问题描述&#xff1a; Unbuntu下怎么生成SSL自签证书&#xff1f; 解决方案&#xff1a; 生成自签名SSL证书可以使用OpenSSL工具&#xff0c;这是一个广泛使用的命令行工具&#xff0c;用于创建和管理SSL/TLS证书。以下是生成自签名…

springboot446数字化农家乐管理平台的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

laya游戏引擎中打包之后图片模糊

如下图正常运行没问题&#xff0c;打包之后却模糊 纹理类型中的默认类型都是精灵纹理&#xff0c;改为默认值即可。注意&#xff1a;要点击“应用”才可有效。精灵纹理类型会对图片进行渲染处理&#xff0c;而默认值 平面类型不会处理图片。

[SZ901]FPGA程序固化工具使用方法

工具为脚本形式&#xff0c;前期需进行vivado版本&#xff0c;下载器端口配置 1&#xff0c;编辑 【SZ901程序固化工具.bat】&#xff0c;设置软件版本 修改软件版本和安装路径 2&#xff0c;设置下载器端口&#xff08;SZ901->USER_TCL->FlashBurn_Config.tcl&#x…

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…

Arduino ADC模数转换

1.Arduino UNO ADC的配置及原理 1.1ADC配置 1.1.1分辨率 Arduino Uno支持6个adc模数转换,其ADC只有10位分辨率,也就是说我们只能将输入电平分成2^101024份(0~1023),4.88mV的测量精度. 1.1.2输入电压范围 Arduino Uno的引脚输出是5V,同样引脚输入也最多支持5V,我们可以5V电压分…

论文笔记:是什么让多模态学习变得困难?

整理了What Makes Training Multi-modal Classification Networks Hard? 论文的阅读笔记 背景方法OGR基于最小化OGR的多监督信号混合在实践中的应用 实验 背景 直观上&#xff0c;多模态网络接收更多的信息&#xff0c;因此它应该匹配或优于其单峰网络。然而&#xff0c;最好的…

唯品会Android面试题及参考答案

HTTP 和 HTTPS 的区别是什么&#xff1f;你的项目使用的是 HTTP 还是 HTTPS&#xff1f; HTTP 和 HTTPS 主要有以下区别。 首先是安全性。HTTP 是超文本传输协议&#xff0c;数据传输是明文的&#xff0c;这意味着在数据传输过程中&#xff0c;信息很容易被窃取或者篡改。比如&…

LWIP协议:三次握手和四次挥手、TCP/IP模型

一、三次握手&#xff1a;是客户端与服务器建立连接的方式&#xff1b; 1、客户端发送建立TCP连接的请求。seq序列号是由发送端随机生成的&#xff0c;SYN字段置为1表示需要建立TCP连接。&#xff08;SYN1&#xff0c;seqx&#xff0c;x为随机生成数值&#xff09;&#xff1b;…

Kafka Streams 在监控场景的应用与实践

作者&#xff1a;来自 vivo 互联网服务器团队- Pang Haiyun 介绍 Kafka Streams 的原理架构&#xff0c;常见配置以及在监控场景的应用。 一、背景 在当今大数据时代&#xff0c;实时数据处理变得越来越重要&#xff0c;而监控数据的实时性和可靠性是监控能力建设最重要的一环…

Medium是什么,Medium能干嘛,如何用开通medium会员

1.背景介绍 1.1 什么是medium medium是国外一个内容创作和分享平台。 主要用户来自美国&#xff0c;每月有26万的访问量。 网址&#xff1a; Medium官网 平台注重优质、专业的内容。 这个平台有2点比较吸引人&#xff1a; ① 内容优质、专业 ② 在上面写作&#xff0c;能…

【实验17】不同优化算法的比较分析

目录 1 不同优化算法比较分析-2D可视化实验 1.1 优化算法的实验设定(以函数为例) 1.2 学习率调整优化策略 1.1.2 AdaGrad算法 1.1.2 RMSprop算法 1.3 梯度估计修正优化策略 1.3.1 动量法 1.3.2 Adam算法 1.4 完整代码 1.5 函数 的优化算法比较 2 不同优化算法比较分…

复习打卡大数据篇——Hadoop HDFS 01

目录 1. HDFS简介 2. HDFS基本操作 3. HDFS原理 1. HDFS简介 HDFS概念&#xff1a; HDFS是一个分布式的文件系统。分布式意味着多台机器存储&#xff0c;文件系统&#xff0c;就是用来存储文件、存储数据。是大数据最底层一个服务。 HDFS设计目标&#xff1a; 故障的检测…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

基于base32的兑换码算法(思路)

base32编码指的是基于32个可打印字符对任意字节数据进行编码&#xff1a;大写字母A-Z以及数字2-7。 兑换码要求:长度为10个字符 如果将这32个字符依次放到一个base数组中&#xff0c;那么最大的下标就是31。我们将要编码的任意字节数据按照五个bit为一组进行划分&#xff0c;…

前端开发环境(vue)

1. 安装nvm管理nodejs的版本 1. 配置nvm 2. 用npm安装nodejs,选则nodejs版本,这是js的运行环境 3 . 安装npm,这是前端的包管理器 npm是nodejs开发的包管理器,现在下载了nodejs就默认下载npm了,绑在一块了,不用 1. npm的中央仓库 2. npm私服仓库 换库 npm config set r…