Redis学习(12)|使用Redis在Spring Boot中实现分布式锁

文章目录

    • 使用场景
    • 优缺点
      • 优点
      • 缺点
    • 注意事项
    • 实现步骤
      • 1. 添加依赖
      • 2. 配置Redis连接
      • 3. 实现分布式锁逻辑
        • 3.1 创建Redis配置类
        • 3.2 创建RedisLock类
        • 3.3 使用RedisLock实现分布式锁
    • 最佳实践

Hello大家好,我是阿月,坚持学习,老年痴呆追不上我,今天我们学习如何使用Redis在Spring Boot中实现分布式锁

使用场景

分布式锁在分布式系统中非常重要,常见的使用场景包括:

  1. 保证数据一致性:在多个服务实例同时操作共享资源时,使用分布式锁可以避免数据冲突,确保数据一致性。
  2. 限流控制:限制高并发情况下对某一资源的访问频率,避免资源过载。
  3. 任务调度:确保同一时间只有一个服务实例执行特定任务,避免重复执行。

优缺点

优点

  1. 简单易用:Redis提供了丰富的API,可以轻松实现分布式锁。
  2. 高性能:Redis的高性能和低延迟确保了分布式锁的高效性。
  3. 丰富的特性:支持过期时间,自动释放锁,避免死锁。

缺点

  1. 单点故障:如果Redis节点宕机,分布式锁将不可用。可以通过Redis集群或主从复制来解决这一问题。
  2. 锁误释放:在某些极端情况下,可能会误释放其他客户端持有的锁,需谨慎设计和使用。

注意事项

  1. 锁的唯一性:锁的key必须是唯一的,以防止不同的业务场景混用同一个锁。
  2. 合理设置过期时间:过期时间应比业务逻辑执行时间略长,避免锁的过期时间太短导致锁过早释放。
  3. 避免死锁:应确保在任何情况下都能释放锁,避免出现死锁。
  4. 锁续期:在某些长时间业务场景中,需要实现锁的续期机制。

实现步骤

1. 添加依赖

pom.xml文件中添加Spring Data Redis的依赖。

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

2. 配置Redis连接

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

spring.redis.host=localhost
spring.redis.port=6379

3. 实现分布式锁逻辑

3.1 创建Redis配置类

用于配置RedisTemplate和StringRedisTemplate。

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.core.StringRedisTemplate;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);return template;}@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {return new StringRedisTemplate(factory);}
}
3.2 创建RedisLock类

用于实现分布式锁的逻辑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class RedisLock {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public boolean lock(String key, String value, long timeout, TimeUnit unit) {Boolean success = stringRedisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit);return success != null && success;}public void unlock(String key, String value) {String currentValue = stringRedisTemplate.opsForValue().get(key);if (value.equals(currentValue)) {stringRedisTemplate.delete(key);}}
}
3.3 使用RedisLock实现分布式锁

在控制器中使用RedisLock来加锁和解锁。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.UUID;
import java.util.concurrent.TimeUnit;@RestController
public class TestController {@Autowiredprivate RedisLock redisLock;@GetMapping("/testLock")public String testLock() {String key = "lockKey";String value = UUID.randomUUID().toString();try {// 尝试加锁boolean isLocked = redisLock.lock(key, value, 10, TimeUnit.SECONDS);if (isLocked) {// 执行业务逻辑return "Lock acquired and business logic executed";} else {return "Failed to acquire lock";}} finally {// 释放锁redisLock.unlock(key, value);}}
}

最佳实践

  1. 使用唯一ID:锁的value应使用唯一ID,如UUID,以区分不同客户端的锁。
  2. 合理设置过期时间:根据业务需求设置合理的过期时间,避免锁的过期时间过短或过长。
  3. 异常处理:在加锁和解锁时处理可能的异常,确保锁能够正确释放。
  4. 锁续期机制:在长时间任务中,可以引入锁续期机制,确保任务执行过程中锁不会过期。
  5. 分布式锁中间件:对于复杂的分布式锁需求,可以考虑使用成熟的分布式锁中间件,如Redisson。

通过以上步骤和最佳实践,可以在Spring Boot中使用Redis实现高效可靠的分布式锁,确保分布式系统中共享资源的安全访问。

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

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

相关文章

Hugging Face发布重量级版本:Transformer 4.42

Hugging Face 宣布发布Transformer 4.42&#xff0c;该版本为流行的机器学习库带来了许多新功能和增强功能。此版本引入了几个高级模型&#xff0c;支持新工具和检索增强生成 &#xff08;RAG&#xff09;&#xff0c;提供 GGUF 微调&#xff0c;并整合了量化的 KV 缓存&#x…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Android Studio 解决AAPT: error: file failed to compile

1.找到项目下的build.gradle 2.在android语块中添加下面代码 aaptOptions.cruncherEnabled false aaptOptions.useNewCruncher false 12

【数据结构】栈和队列-相互实现OJ题

前言&#xff1a; 本题目是关于栈和队列的OJ题目&#xff0c;需对栈和队列有一定了解再进行做题&#xff0c;若不了解可以根据我之前这篇文章进行学习&#xff1a;【数据结构】栈和队列-CSDN博客,题中需要的栈和队列的实现也在该文章中有源代码 目录 前言&#xff1a; 一.用…

探索WebKit的Flexbox奇境:CSS Flexbox支持全解析

探索WebKit的Flexbox奇境&#xff1a;CSS Flexbox支持全解析 在现代网页设计中&#xff0c;响应式布局的需求日益增长&#xff0c;CSS Flexbox作为布局模式的一个突破性进展&#xff0c;提供了一种更加高效和灵活的方式来设计复杂的用户界面。WebKit&#xff0c;作为众多流行浏…

在Ubuntu 16.04上安装和配置Nextcloud的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Nextcloud 是 ownCloud 的一个分支&#xff0c;是一个文件共享服务器&#xff0c;允许您将个人内容&#xff08;如文档和图片&…

怎样将word默认Microsoft Office,而不是WPS

设置——>应用——>默认应用——>选择"word"——>将doc和docx都选择Microsoft Word即可

面试题-Spring家族与SpringIOC

1.spring家族的介绍 Spring简单图&#xff1a; 2.IOC原理 IOC就是原先代码里需要开发者实现对象的创建和关系依赖&#xff0c;反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 依赖注入的方式&#xff1a; Setter&#xff1a;实现特定属性的public sette…

酱酒特点标准术语

酱酒的独特风味可以通过一系列专业的标准术语进行描绘&#xff0c;这些术语不仅包括了酱酒的香气和口感&#xff0c;还涵盖了对酱酒的深度品鉴知识。以下是酱酒亮哥收集的一些关键的酱酒特性标准术语&#xff1a; 酱香显著&#xff1a;这是酱香型白酒的香气特征&#xff0c;表…

Evented PLEG: iSulad 稳态 CPU 利用率降低30%的关键特性

背景 容器技术在不断发展的过程中&#xff0c;已被广泛应用于多种场景。OpenAtom openEuler&#xff08;简称"openEuler"&#xff09; 社区容器引擎项目 iSulad[1]面向 CT、IT 领域的不同需求而生&#xff0c;它具有轻量级、高性能的特点&#xff0c;可以在资源受限…

[C++11] noexcept 完整解析

说明&#xff1a;noexcept是C11标准引入的一个关键字&#xff0c;用于指示一个函数是否被保证不会抛出异常。如果但从设计角度看会感觉很奇怪&#xff0c;明明是有问题才抛出异常&#xff0c;那为什么还是在某些时候禁止抛异常呢&#xff1f;接下来我们了解下C11 为什么引入了 …

高性能LDO电路设计,有配套文档

内容&#xff1a; 1、电路文件&#xff08;有仿真状态&#xff09;和PDK&#xff08;TSMC180&#xff09; 2、配套仿真结果文档讲解6页 3、参考资料三篇 指标&#xff1a; LDO 温度系数1.09ppm LDO 环路增益在 64.3dB&#xff0c;相位裕度在 66&#xff0c;系统稳定。 LDO 最大…

【问题】升级指定conda虚拟环境的python到指定版本

1 背景 当前conda环境的名字为python38,进入环境python38命令如下: conda activate python38 2 升级python到3.10版本 conda install python=3.10 3 查看python版本 conda list -n python38 python

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术&#xff0c;允许组件之间进行松耦合通信。通过使用事件监听机制&#xff0c;应用程序的各个组件可以在其他组件不直接引用的情况下&#xff0c;相互发送和接受消息。 需求 在技术派中有这样一个需求&#xff0c;当发布文章或…

Linux驱动入门-最简单字符设备驱动

一、字符设备驱动概念 1. 什么是字符设备驱动&#xff1f; 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;按字节流进行读写操作&#xff0c;数据读写有先后顺序。常见的字符设备包括LED灯、按键、IIC、SPI、LCD等。字符设备驱动就是为这些设备编写的驱动程序。 …

ollama,springAi实现自然语言处理

ollama安装使用&#xff1a; https://ollama.com/ 下载速度比较慢的可以直接使用以下版本0.1.41 https://pan.baidu.com/s/1hCCkYvFjWqxvPyYA2-YElA?pwdotap 直接管理员身份双击安装&#xff0c;安装成功后会在任务栏里出现这个小图标&#xff1a; 打开cmd&#xff0c;输入…

java实现图像分割合并

Java实现图片操作&#xff1a;切割、缩放、重置、拼接、合并、水印、画单点、画线段等_java拼接图片并截掉一部分-CSDN博客

WhatsApp:连接世界的即时通讯巨头

在数字化浪潮席卷全球的今天&#xff0c;即时通讯工具已成为人们日常生活中不可或缺的一部分。其中&#xff0c;WhatsApp凭借其卓越的功能、出色的用户体验和广泛的用户基础&#xff0c;在全球通讯领域崭露头角&#xff0c;成为连接世界的即时通讯巨头。今天将带您深入了解What…

tkinter显示图片

tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…

2024.7.1 刷题总结

2024.7.1 **每日一题** 2065.最大化一张图中的路径价值&#xff0c;本题可以从数据范围得到思路的参考&#xff0c;根据总最大时间和单个最小时间得到最多可以有十条边&#xff0c;即搜索树有11层&#xff0c;每个节点最多有4个儿子&#xff0c;可视为一棵层数至多为11的四叉树…