Redission从入门到入门

2023-12-14 10:30
文章标签 入门 redission

本文主要是介绍Redission从入门到入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Redisson简介

Redisson 是一个在 Java 环境中使用的 Redis 客户端库。它提供了丰富的功能,使得在 Java 应用中与 Redis 交互变得更加简单和高效。Redisson 不仅提供了基本的 Redis 操作,还提供了许多高级功能,使其成为在 Java 项目中实现分布式和可扩展解决方案的强大工具。以下是 Redisson 的一些主要特点和功能:

1. 易于使用的 Java 对象接口

Redisson 提供了一系列的 Java 集合和工具的接口实现,如 MapSetListQueue 等,这些接口都直接映射到 Redis 数据结构,使得使用 Redis 就像使用 Java 中的常规数据结构一样简单。

2. 分布式对象和服务

Redisson 实现了许多分布式对象(例如分布式锁、原子长整型、计数信号量、闭锁等),这些对象在分布式环境中非常有用。例如,它提供了一个可靠的分布式锁实现,这是在分布式系统中实现互斥操作的常见需求。

3. 发布/订阅机制

Redisson 充分利用了 Redis 的发布/订阅功能,提供了一个简单的 API 来实现消息的发布和订阅。

4. 高可用性和集群支持

Redisson 对 Redis 的主从复制和哨兵模式提供了良好的支持,也支持 Redis 集群模式,这有助于构建高可用的大规模分布式应用。

5. 易于集成

它可以轻松与框架如 Spring、Spring Boot 集成,提供了对多种序列化机制(例如 JSON、Avro、Smile、CBOR 等)的支持。

6. Redis 数据类型的高级功能

Redisson 扩展了 Redis 的基本数据类型,提供了如延迟队列、优先队列、双端队列、映射缓存、集合等更高级的结构和功能。

7. 实时地图缩减和分布式服务

Redisson 还提供了其他高级功能,比如实时地图缩减、分布式服务和任务执行等。

总之,Redisson 是一个功能丰富且高度专业化的库,适用于那些希望通过 Redis 解决复杂分布式数据处理和存储问题的 Java 应用程序。通过 Redisson,开发人员可以更容易地将 Redis 的强大功能集成到他们的 Java 应用中。

2. 使用Redisson加分布式锁

使用Redisson实现分布式锁通常涉及以下几个步骤:配置Redisson客户端、获取锁、执行业务逻辑,以及释放锁。下面是一个结合Spring Boot控制器(Controller)处理HTTP请求的示例:

1. 添加Redisson依赖

首先,在你的Spring Boot项目的pom.xml中添加Redisson依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId>
</dependency>

2. 配置Redisson客户端

在你的Spring Boot应用中配置Redisson客户端。这可以在一个配置类中完成,例如:

@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");return Redisson.create(config);}
}

3. 创建Controller

创建一个Controller,使用Redisson分布式锁来处理请求:

@RestController
@RequestMapping("/api")
public class MyController {private final RedissonClient redissonClient;public MyController(RedissonClient redissonClient) {this.redissonClient = redissonClient;}@GetMapping("/perform-task")public ResponseEntity<String> performTask() {RLock lock = redissonClient.getLock("myLock");try {// 尝试获取锁,最多等待100秒,锁定后100秒自动解锁boolean isLocked = lock.tryLock(100, 100, TimeUnit.SECONDS);if (isLocked) {// 执行业务逻辑try {// 业务逻辑return ResponseEntity.ok("任务执行成功");} finally {lock.unlock();}} else {return ResponseEntity.status(HttpStatus.CONFLICT).body("无法获取锁");}} catch (InterruptedException e) {Thread.currentThread().interrupt();return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("操作被中断");}}
}

在这个示例中,当HTTP GET请求发送到/api/perform-task时,会尝试获取名为myLock的锁。如果获取到锁,它会执行业务逻辑(在此示例中仅返回一个成功消息),然后释放锁。如果无法获取锁,则返回一个冲突状态的响应。

注意

  • 锁的名称(在此例中为myLock)应该是唯一的,以区分不同的锁。
  • 使用tryLock而不是lock,因为tryLock可以避免死锁的情况。它还允许你指定获取锁的最大等待时间和锁定时间。
  • 确保在业务逻辑执行后释放锁,最好放在finally块中以确保锁一定会被释放。
  • 锁的持有时间应该足够长,以确保业务逻辑能够执行完成。

这个过程确保了在分布式环境中,同一时间只有一个进程可以执行特定的代码块,有效地防止了并发执行引发的问题。

3. 加锁解锁流程

加锁

  1. 锁的唯一标识:Redisson 生成一个唯一的标识符(比如UUID),用于标识锁的持有者。

  2. 尝试获取锁:Redisson 向 Redis 发送一个 SET 命令,附带 NX(Not Exists,只有键不存在时才设置键)和 PX(设置键的过期时间,毫秒级)选项。键的名称对应于锁名,值为上述生成的唯一标识符。

  3. 判断锁的获取:如果 SET 命令成功(返回1),则表示当前线程成功获取了锁。如果命令失败(返回0),表示锁已被其他线程或进程持有。

  4. 重试机制:如果未能获取锁,Redisson 会等待一段时间后重试,直到超时或获取锁为止。

解锁

解锁操作通常包括以下步骤:

  1. 验证锁的所有权:Redisson 会首先验证当前线程是否持有该锁。这通常是通过比较 Redis 中锁对应的值(即前面提到的唯一标识符)来实现的。

  2. 释放锁:如果当前线程是锁的持有者,Redisson 会发送一个命令(比如 DEL 命令)来删除对应的键,从而释放锁。

  3. Lua 脚本:为了保证操作的原子性,上述两个步骤(验证和删除)通常是通过执行一个 Lua 脚本在 Redis 服务器上完成的。

锁续期

锁的续期是为了防止长时间运行的进程因执行时间超过锁的过期时间而导致锁被意外释放。Redisson 的锁续期通常涉及以下几个步骤:

  1. 看门狗(Watchdog)机制:Redisson 内部有一个看门狗机制,它会在后台运行。

  2. 定期续期:当一个线程持有锁时,看门狗会定期(默认情况下每隔10秒)检查所有由当前Redisson实例持有的锁。

  3. 发送续期命令:如果锁即将到期,看门狗会向 Redis 发送命令(比如 PEXPIRE),更新锁的过期时间,从而避免锁被意外释放。

  4. 续期失败处理:如果续期失败(例如因为 Redis 服务器不可用),看门狗会尝试重新获取锁或触发相应的错误处理逻辑。

这篇关于Redission从入门到入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492167

相关文章

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二