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 服务器不可用),看门狗会尝试重新获取锁或触发相应的错误处理逻辑。

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

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

相关文章

以下是一些自然语言处理(NLP)技术的例子:

以下是一些自然语言处理&#xff08;NLP&#xff09;技术的例子&#xff1a; 语音识别&#xff1a;将说话者的语音转换为文本形式&#xff0c;从而使机器能够理解和分析语音内容。 文本分类&#xff1a;将大量的文本分成不同的类别&#xff0c;例如新闻、评论、博客等。 情感…

IO / 线程同步互斥概念总结

1. 为什么要引入线程同步互斥机制 线程共享用户空间&#xff0c;当多个线程访问临界资源时会产生竟态&#xff0c;引入线程同步互斥机制是为了保护临界资源 2. 同步互斥的基本概念 临界资源&#xff1a;多线程任务执行时&#xff0c;能够同时访问的公共资源叫做临界资源临界区…

富时中国a50指数期货论文

富时中国A50指数期货概述 富时中国A50指数期货是中国境内市场上的一种衡量蓝筹股表现的期货合约&#xff0c;其跟踪富时中国A50指数的表现。富时中国A50指数是由富时罗素指数有限公司编制的一种反映中国大陆A股市场50只流动性好、市值大的股票的指数。 市场背景与意义 富时中…

kafka 详细介绍

目录 前言 分布式架构&#xff1a; 消息发布-订阅模型&#xff1a; 持久性存储&#xff1a; 分区和副本&#xff1a; 水平扩展&#xff1a; 高性能&#xff1a; 生态系统&#xff1a; 我的其他博客 前言 Kafka 是由 Apache 软件基金会开发的一种开源流处理平台&#xf…

微信小程序自定义提示框组件并使用插槽 tooltip

创建tooltip组件引用 创建一个自定义组件&#xff0c;例如命名为 tooltip tooltip.wxml&#xff1a;用于定义组件的结构&#xff1b; <!--components/tooltip/tooltip.wxml--> <view class"tooltip-wrapper" hidden"{{hidden}}" style"lef…

纺织辅料小程序商城制作全攻略

随着互联网的普及和移动支付的便捷性&#xff0c;越来越多的消费者喜欢在线购物&#xff0c;尤其是购买纺织辅料这类产品。为了满足消费者的需求&#xff0c;纺织辅料企业或商家需要制作一个专业的小程序商城&#xff0c;以便更好地展示和销售自己的产品。本文将详细介绍如何制…

linux命令awk使用

awk是一条命令&#xff0c;也可以说是一种编程语言, 数据来源可以来自stdin&#xff0c;一个或多个文件。它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux/unix下的一个强大编程工具。awk有很多内建的功能&#xff0c;比如数组、函数等&#xff0c;这是它和…

Fine-Grained Semantically Aligned Vision-Language Pre-Training细粒度语义对齐的视觉语言预训练

abstract 大规模的视觉语言预训练在广泛的下游任务中显示出令人印象深刻的进展。现有方法主要通过图像和文本的全局表示的相似性或对图像和文本特征的高级跨模态关注来模拟跨模态对齐。然而&#xff0c;他们未能明确学习视觉区域和文本短语之间的细粒度语义对齐&#xff0c;因为…

Java开发环境简介(JDK、JRE、JVM)

目录 1、Java开发环境 2、JDK和JRE 3、JDK下载和安装 3.1 下载 3.2 安装 3.3 配置path环境变量 JDK8配置方案1&#xff1a;只配置path ⭐JDK8配置方案2&#xff1a;配置JAVA_HOMEpath&#xff08;推荐&#xff09; path配置小结 JDK17配置方案&#xff1a;自动配置 …

redis-学习笔记(Jedis 前置知识)

自定义的 Redis 客户端 咱们可以实现编写出一个自定义的 Redis 客户端 因为 Redis 公开了自己使用的自定义协议 ---- RESP 协议清楚了, 那么通信数据格式就清除了, 就能完成各层次之间的数据传输, 就能开发服务器和客户端 RESP — Redis 的 序列化 协议 特点: 简单好实现快读进…

C++友元类,工厂模式和继承的融合案例

//友元没有继承性&#xff0c;没有传递性,所以在animal中定义友元类是无效的class animal{public:animal(){};virtual ~animal(){};};class Cat:public animal{friend class animalFactory;private:Cat(){}private:string m_name;string m_color;public:void about(){cout<&…

独孤思维:白嫖我项目,还这么理直气壮

你在副业圈呆久了&#xff0c;会遇到各种各样&#xff0c;形形色色的人。 昨天有个人突然冒出来&#xff0c;问我绝版书某个细节怎么规避。 我看了和他之前的聊天记录&#xff0c;他是去年加我的&#xff0c;当时加我的时候给他发了一些资料。 这些免费的资料&#xff0c;主…

代码审计中的常见漏洞【一】

预计更新一、代码审计简介 代码审计的定义、作用和流程代码审计的分类和方法论 二、代码审计的准备工作 代码审计前需要了解的基础知识和技能代码审计的工具和环境准备 三、代码审计中的常见漏洞 SQL注入漏洞XSS漏洞CSRF漏洞 4.文件包含漏洞 5.文件上传漏洞 四、代码审计…

AC修炼计划(AtCoder Beginner Contest 332)

传送门&#xff1a;AtCoder Beginner Contest 332 - AtCoder a,b,c都还是很基础了。d题是一个bfs的纯暴力问题。 E - Lucky bag 看看范围&#xff0c;n15&#xff0c;第一个想法是dfs纯暴力&#xff0c;但所有的情况太大&#xff0c;各种决策层出不穷&#xff0c;会t。所以转…

VM实现方式及其优缺点

在众多VM实现方式中&#xff0c;我可以说几种常见的实现方式。例如&#xff0c;基于栈的方式、基于寄存器的方式、基于堆的方式等。下面我将分别对这几种方式进行阐述&#xff0c;并讨论它们各自的优点和缺点&#xff0c;以及它们各自的应用场景。 基于栈的方式 基于栈的方式…

Lightweight Directory Access Protocol (LDAP 轻量级目录访问协议)

The Lightweight Directory Access Protocol (LDAP /ˈɛldp/) is an open, vendor-neutral, industry standard application protocol for accessing and maintaining distributed directory information services over an Internet Protocol (IP) network.[1] Directory serv…

RocketMQ可视化工具 打包遇到的yarn intall 问题

文章目录 RocketMQ可视化工具1.github上下载2.修改参数3.运行4.打包5.出错6.解决7.重试8.再解决9.很奇怪运行没错&#xff0c;但是测试错啦10.不想深究&#xff0c;直接跳过测试11.展示成功 RocketMQ可视化工具 1.github上下载 下载地址 https://github.com/apache/rocketmq-…

基于Hadoop的电商数据分析系统设计与实现

基于Hadoop的电商数据分析系统设计与实现 Design and Implementation of E-commerce Data Analysis System based on Hadoop 目录 目录 2 摘要 3 关键词 3 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.3 现有研究综述 6 第二章 Hadoop技术介绍 8 2.1 Hadoop概述 8 2.…

redis:二、缓存击穿的定义、解决方案(互斥锁、逻辑过期)的优缺点和适用场景、面试回答模板

缓存击穿的定义 缓存击穿是一种现象&#xff0c;具体就是某一个数据过期时&#xff0c;恰好有大量的并发请求过来&#xff0c;这些并发的请求可能会瞬间把DB压垮。典型场景就是双十一等抢购活动中&#xff0c;首页广告页面的数据过期&#xff0c;此时刚好大量用户进行请求&…

protobuf、protobuf-c、protobuf-c-rpc在Linux(Ubuntu18.04)编译安装及交叉编译arm\aarch64版本

protobuf、protobuf-c、protobuf-c-rpc在Linux&#xff08;Ubuntu18.04&#xff09;编译安装及交叉编译arm\aarch64版本 文章目录 protobuf、protobuf-c、protobuf-c-rpc在Linux&#xff08;Ubuntu18.04&#xff09;编译安装及交叉编译arm\aarch64版本一、前言二、protobuf、rp…