Redisson学习专栏(一):快速入门及核心API实践
文章目录
- 前言
- 一、Redisson简介
- 1.1 什么是Redisson?
- 1.2 解决了什么问题?
- 二、快速入门
- 2.1 环境准备
- 2.2 基础配置
- 三、核心API解析
- 3.1 分布式锁(RLock)
- 3.2 分布式集合
- 3.2.1 RMap(分布式Map)
- 3.2.2 RList(分布式列表)
- 3.2.3 RDelayedQueue:延时队列实现
- 3.2.4 限流器(RRateLimiter)
- 3.2.5 原子操作(RAtomicLong)
- 3.2.6 分布式锁(RLock)
- 3.2.7 RBucket:分布式对象存储
- 3.2.8 RReadWriteLock:分布式读写锁
- 总结
前言
在分布式系统的世界里,开发者的日常往往被琐碎的复杂性填满。想象一个典型的电商场景:凌晨的秒杀活动涌入十万用户,数据库在并发请求下摇摇欲坠;跨地域部署的微服务集群中,某个节点的配置更新总比其他节点慢半拍;定时任务在多台服务器上重复执行,日志混乱得如同纠缠的耳机线。这些场景的背后,是分布式环境下数据一致性、并发控制和系统协调的永恒难题。
传统解决方案往往让人陷入两难:依赖数据库事务虽能保证强一致性,却让性能断崖式下跌;手动实现分布式锁需要处理锁续期、可重入、故障恢复等细节,代码复杂度呈指数级增长;而基于消息队列的异步处理,又可能引发数据延迟和一致性问题。这种时候,开发者需要的不是一个临时拼凑的补丁方案,而是一套开箱即用的分布式系统工具箱。
这正是Redisson的价值所在。作为基于Redis的Java客户端,Redisson将分布式系统的核心需求——锁、队列、原子操作、数据同步——封装成简洁的API,让开发者像操作本地集合一样处理分布式资源。当你在代码中调用RLock.lock() 时,背后是自动续期的看门狗机制在守护锁的生命周期;当你使用RMap.put() 更新数据时,跨节点的监听器已在默默同步所有副本;当你通过RScheduledExecutorService调度任务时,分布式环境下的唯一性执行已悄然实现。
Redisson的独特之处在于它既保留了Redis的高性能基因,又弥补了原生Redis在分布式场景中的不足。它不只是一个连接Redis的桥梁,而是一套完整的分布式编程范式。从可重入锁到公平锁,从限流器到分布式计数器,从延迟队列到远程服务调用,这些功能不是简单的命令封装,而是经过多年生产环境验证的可靠性设计。
接下来Redisson的学习专栏带大家穿透Redisson的核心机制,这篇带领大家快速入门这门技术…
一、Redisson简介
1.1 什么是Redisson?
Redisson是一个基于Redis实现的Java驻内存数据网格(In-Memory Data Grid),它不仅提供了对Redis的基础操作支持,更重要的是为分布式系统开发提供了丰富的分布式服务。作为Redis官方推荐的Java客户端之一,Redisson在Jedis和Lettuce的基础上进行了更高层次的抽象。
版本支持:最新版支持Redis 2.8至7.0+的所有版本
核心特性:
- 分布式对象(Distributed Objects)
- 分布式集合(Distributed Collections)
- 分布式锁(Distributed Locks)
- 分布式服务(Distributed Services)
- 支持Reactive编程
- 与Spring框架深度集成
1.2 解决了什么问题?
在分布式系统架构中,开发者常面临以下挑战:
常见问题 | 传统解决方案痛点 | Redisson解决方案 |
---|---|---|
分布式锁 | 需要手动实现锁续期、可重入等机制 | 提供现成的RLock对象 |
限流控制 | 需要编写复杂的Lua脚本 | 内置RateLimiter组件 |
数据分片 | 需要自行处理数据分布 | 支持自动分片的集合类型 |
延迟队列 | 需要组合多种数据结构 | 提供RDelayedQueue实现 |
跨JVM缓存 | 各节点缓存不一致 | 支持分布式Map/Set |
二、快速入门
2.1 环境准备
Maven依赖配置:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.4</version>
</dependency>
2.2 基础配置
单节点配置示例:
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("your_password").setDatabase(0);RedissonClient redisson = Redisson.create(config);
集群模式配置:
Config config = new Config();
config.useClusterServers().addNodeAddress("redis://192.168.0.1:7001").addNodeAddress("redis://192.168.0.2:7002").setScanInterval(2000); // 集群状态扫描间隔
三、核心API解析
3.1 分布式锁(RLock)
典型应用场景:
- 分布式定时任务调度
- 库存扣减
- 重要操作排他控制
RLock lock = redisson.getLock("orderLock");// 支持自动续期的加锁方式
lock.lock(30, TimeUnit.SECONDS); try {// 业务逻辑处理processOrder();
} finally {lock.unlock();
}// 尝试非阻塞加锁
if (lock.tryLock()) {try {// 获取锁成功处理} finally {lock.unlock();}
} else {// 获取锁失败处理
}
3.2 分布式集合
3.2.1 RMap(分布式Map)
RMap<String, Object> map = redisson.getMap("userCache");// 原子操作示例
map.putIfAbsent("user1", new User());
map.fastPutAsync("user2", new User());// 本地缓存支持(降低网络开销)
LocalCachedMapOptions options = LocalCachedMapOptions.defaults().cacheSize(1000).evictionPolicy(EvictionPolicy.LRU);
RMap<String, Object> localMap = redisson.getLocalCachedMap("localCache", options);
3.2.2 RList(分布式列表)
RList<Object> list = redisson.getList("messageQueue");// 批量操作
list.addAll(messages);
list.readAll().forEach(System.out::println);// 支持元素过期时间
list.add(new Message(), 1, TimeUnit.HOURS);
3.2.3 RDelayedQueue:延时队列实现
架构设计:
代码应用:
// 创建目标队列
RBlockingQueue<String> destinationQueue = redisson.getBlockingQueue("orderQueue");// 创建延时队列(绑定目标队列)
RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(destinationQueue);// 添加延时任务(30分钟后执行)
delayedQueue.offer("order202305281234", 30, TimeUnit.MINUTES);// 消费者处理
new Thread(() -> {while (true) {String order = destinationQueue.take();processExpiredOrder(order);}
}).start();
3.2.4 限流器(RRateLimiter)
令牌桶算法实现:
RRateLimiter limiter = redisson.getRateLimiter("apiLimiter");// 初始化:每秒生成5个令牌
limiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS);if (limiter.tryAcquire()) {// 处理请求
} else {// 限流处理
}
3.2.5 原子操作(RAtomicLong)
RAtomicLong counter = redisson.getAtomicLong("visitCounter");// 原子递增
long current = counter.incrementAndGet();// 分布式环境下的比较设置
counter.compareAndSet(expectedValue, newValue);
3.2.6 分布式锁(RLock)
关键方法详解:
// 创建可重入锁
RLock lock = redisson.getLock("resourceLock");// 1. 基础加锁(默认30秒有效期)
lock.lock(); // 2. 尝试加锁(等待时间,自动释放时间)
boolean res = lock.tryLock(10, 60, TimeUnit.SECONDS);// 3. 异步加锁
RFuture<Void> future = lock.lockAsync();// 4. 公平锁实现
RLock fairLock = redisson.getFairLock("fairLock");// 5. 联锁(MultiLock): 需所有锁都获取成功
RLock lock1 = redisson.getLock("lock1");
RLock lock2 = redisson.getLock("lock2");
RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);
multiLock.lock();
3.2.7 RBucket:分布式对象存储
RBucket是Redisson中最基础的分布式对象,提供了对任意Java对象的原子操作能力。它解决了分布式环境下对象存储的三大痛点:
- 对象序列化与反序列化
- 原子性更新保证
- 生命周期管理(TTL)
RBucket<MyObject> bucket = redisson.getBucket("user:session:123");// 1. 基础存取操作
bucket.set(new MyObject("userData")); // 存储对象
MyObject obj = bucket.get(); // 获取对象// 2. 带TTL的存储(30分钟后过期)
bucket.set(new MyObject(), 30, TimeUnit.MINUTES);// 3. 比较并交换(CAS)原子操作
boolean updated = bucket.compareAndSet(currentObject, // 当前预期值newObject // 新值
);// 4. 获取并删除(原子操作)
MyObject deletedObj = bucket.getAndDelete();// 5. 非阻塞尝试设置
boolean success = bucket.trySet(new MyObject());// 6. 对象保留时间管理
bucket.remainTimeToLive(); // 获取剩余生存时间
bucket.expire(10, TimeUnit.MINUTES); // 重置过期时间
高级特性:
// 7. 对象监听(分布式通知)
bucket.addListener(new BucketListener<MyObject>() {@Overridepublic void onUpdate(BucketEvent<MyObject> event) {System.out.println("对象更新: " + event.getValue());}@Overridepublic void onDelete(BucketEvent<MyObject> event) {System.out.println("对象删除");}
});// 8. 对象引用(避免重复序列化)
RBinaryStream binaryBucket = redisson.getBinaryBucket("binaryData");
binaryBucket.set(serializedBytes); // 存储原始字节
byte[] data = binaryBucket.get(); // 获取原始字节
3.2.8 RReadWriteLock:分布式读写锁
在分布式环境中,读多写少场景下,传统互斥锁会成为性能瓶颈。读写锁实现了:
- 读锁共享:多个客户端可同时获取读锁
- 写锁排他:写锁获取时阻塞所有读/写操作
- 锁降级:写锁可降级为读锁(避免死锁)
核心API详解:
RReadWriteLock rwLock = redisson.getReadWriteLock("documentLock");// 1. 基础锁获取
RLock readLock = rwLock.readLock();
RLock writeLock = rwLock.writeLock();// 2. 读锁使用(共享)
readLock.lock();
try {// 多个客户端可同时执行读取readDocument();
} finally {readLock.unlock();
}// 3. 写锁使用(排他)
writeLock.lock();
try {// 仅一个客户端可执行写入updateDocument();
} finally {writeLock.unlock();
}// 4. 尝试获取锁(带超时)
if (writeLock.tryLock(3, 10, TimeUnit.SECONDS)) {try {// 获取写锁成功} finally {writeLock.unlock();}
}// 5. 锁降级(写锁→读锁)
writeLock.lock();
try {// 执行写操作updateDocument();// 降级开始(保持写锁获取读锁)readLock.lock();
} finally {writeLock.unlock(); // 释放写锁但仍持有读锁
}try {// 此时其他线程可获取读锁但不能获取写锁readDocument();
} finally {readLock.unlock();
}
高级特性:
锁升级(危险操作):
// 注意:直接锁升级可能导致死锁!
readLock.lock();
try {// 错误方式(会导致死锁):// writeLock.lock(); // 正确方式:尝试升级if (writeLock.tryLock()) {try {// 升级成功} finally {writeLock.unlock();}} else {// 处理升级失败}
} finally {readLock.unlock();
}
总结
在分布式系统的复杂业务场景中,Redisson优雅解决并发控制、数据一致性和服务协调等问题。通过本文的探索,我们见证了Redisson如何将晦涩的分布式理论转化为简洁高效的Java API:
核心价值回顾:
- 分布式原语标准化
- 从可重入锁到联锁,从公平锁到读写锁,Redisson将分布式锁的复杂度封装在RLock.lock()一行代码中
- 自动续期的看门狗机制解决了锁超时导致的数据不一致痛点
- 数据一致性新范式
- RMap的原子操作和本地缓存特性,让分布式集合操作如本地集合般自然
- RDelayedQueue的延时队列设计,完美解决定时任务调度难题
- 分布式服务新境界
- RRateLimiter的令牌桶算法实现优雅限流
资源指引:
- 案例代码
下期预告:Redission核心功能深入学习(分布式锁、分布式集合)
相关文章:

Redisson学习专栏(一):快速入门及核心API实践
文章目录 前言一、Redisson简介1.1 什么是Redisson?1.2 解决了什么问题? 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁(RLock)3.2 分布式集合3.2.1 RMap(分布式Map)3.2.2 RList&…...

Pandas学习入门一
1.什么是Pandas? Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。 一个强大的分析和操作大型结构化数据集所需的工具集基础是NumPy…...

基于Piecewise Jerk Speed Optimizer的速度规划算法(附ROS C++/Python仿真)
目录 1 时空解耦运动规划2 PJSO速度规划原理2.1 优化变量2.2 代价函数2.3 约束条件2.4 二次规划形式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 时空解耦运动规划 在自主移动系统的运动规划体系中,时空解耦的递进式架构因其高效性与工程可实现性被广泛采用。这一架…...
关于 JavaScript 版本、TypeScript、Vue 的区别说明, PHP 开发者入门 Vue 的具体方案
以下是关于 JavaScript 版本、TypeScript、Vue 的区别说明,以及 PHP 开发者入门 Vue 的具体方案: 一、JavaScript 版本演进 JavaScript 的核心版本以 ECMAScript 规范(ES) 命名: 版本发布时间关键特性ES52009严格模式…...
中断和信号详解
三种中断 中断分为三种:硬件中断、异常中断、软中断 硬件中断 设备向中断控制器发送中断请求,中断控制器生成对应中断号,然后通过中断引脚向cpu发送高电平,cpu收到请求后不会立即处理,cpu会处理完当前指令ÿ…...
STM32八股【10】-----stm32启动流程
启动流程 1.上电复位 2.系统初始化 3.跳转到 main 函数 启动入口: cpu被清空,程序从0x00000000开始运行0x00000000存放的是reset_handler的入口地址0x00000000的实际位置会变,根据不同的启动模式决定启动模式分为: flash启动&a…...

游戏引擎学习第312天:跨实体手动排序
运行游戏并评估当前状况 目前排序功能基本已经正常,能够实现特定的排序要求,针对单一区域、单个房间的场景,效果基本符合预期。 不过还有一些细节需要调试。现在有些对象的缩放比例不对,导致它们看起来有些怪异,需要…...

智警杯备赛--数据库管理与优化及数据库对象创建与管理
sql操作 插入数据 如果要操作数据表中的数据,首先应该确保表中存在数据。没有插入数据之前的表只是一张空表,需要使用insert语句向表中插入数据。插入数据有4种不同的方式:为所有字段插入数据、为指定字段插入数据、同时插入多条数据以及插…...

MySQL 在 CentOS 7 环境下的安装教程
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习Mysql的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...

K8S集群主机网络端口不通问题排查
一、环境: k8s: v1.23.6 docker: 20.10.14 问题和故障现象:devops主机集群主机节点到端口8082不通(网络策略已经申请,并且网络策略已经实施完毕),而且网络实施人员再次确认,网络策…...
【Elasticsearch】retry_on_conflict
在 Elasticsearch 中,retry_on_conflict 是 _update 和 _update_by_query API 的一个参数,用于处理并发冲突。当多个客户端同时尝试更新同一个文档时,可能会发生版本冲突(version conflict)。retry_on_conflict 参数允…...
Android Cameara2 + MediaRecorder 完成录像功能
一、打开相机、预览 打开相机预览流程是Camera2的默认流程 可参考:https://blog.csdn.net/kk3087961/article/details/135616576 二、开启录像功能 开启录像主要包括以下3步: private void startRecording() {// 1. 停止预览并关闭会话if (mCameraSes…...

python打卡day39
知识点回顾 图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 课程代码: # 先继续之前的代码 import torch import torch.nn as nn import torch.opti…...

3.8.5 利用RDD统计网站每月访问量
本项目旨在利用Spark RDD统计网站每月访问量。首先,创建名为“SparkRDDWebsiteTraffic”的Maven项目,并添加Spark和Scala的依赖。接着,编写Scala代码,通过SparkContext读取存储在HDFS上的原始数据文件,使用map和reduce…...

尚硅谷redis7 49-51 redis管道之理论简介
前提redis事务和redis管道有点像,但本质上截然不同 49 redis管道之理论简介 面试题 如何优化频繁命令往返造成的性能瓶颈? redis每秒可以承受8万的写操作和接近10万次以上的读操作。每条命令都发送、处理、返回,能不能批处理一次性搞定呢…...
Spring Boot + MyBatis-Plus实现操作日志记录
创建数据库表 CREATE TABLE sys_operation_log (log_id bigint NOT NULL AUTO_INCREMENT COMMENT 日志ID,operation_type varchar(20) NOT NULL COMMENT 操作类型,operation_module varchar(50) NOT NULL COMMENT 操作模块,operation_desc varchar(200) DEFAULT NULL COMMENT …...
JavaScript入门基础篇-day03
一、为什么需要数组? 在我们正式学习数组之前,先思考一个场景:假设我们要记录一个班级50位同学的期末成绩。如果不用数组,代码会是这样的: let score1 85; let score2 92; let score3 78; // ... 要写50个变量&am…...
Leetcode-5 好数对的数目
Leetcode-5 好数对的数目(简单) 题目描述思路分析通过代码(python) 题目描述 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j ,就可以认为这是一组 好数对 。 返回好数对的数目。 示…...

openEuler安装MySql8(tar包模式)
操作系统版本: openEuler release 22.03 (LTS-SP4) MySql版本: 下载地址: https://dev.mysql.com/downloads/mysql/ 准备安装: 关闭防火墙: 停止防火墙 #systemctl stop firewalld.service 关闭防火墙 #systemc…...
Opencv实用操作6 开运算 闭运算 梯度运算 礼帽 黑帽
1.相关函数 开运算 img_open cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#(图片,算法,核) 闭运算 img_close cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#(图片,算法,核) 梯度…...

基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统
详细视频:【基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统-哔哩哔哩】 https://b23.tv/azUqQXe...

Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡
Git:现代软件开发的基石——原理、实践与行业智慧优雅草卓伊凡 一、Git的本质与核心原理 1. 技术定义 Git是一个分布式版本控制系统(DVCS),由Linus Torvalds在2005年为管理Linux内核开发而创建。其核心是通过快照(Sna…...

NLua性能对比:C#注册函数 vs 纯Lua实现
引言 在NLua开发中,我们常面临一个重要选择:将C#函数注册到Lua环境调用,还是直接在Lua中实现逻辑? 直觉告诉我们,C#作为编译型语言性能更高,但跨语言调用的开销是否会影响整体性能?本文通过基准…...

【计算机网络】第2章:应用层—Web and HTTP
目录 一、Web 与 HTTP 二、总结 (一)Web 的定义与功能 (二)HTTP 协议的定义与功能 (三)HTTP 协议的核心机制 1. HTTP 请求与响应流程 2. HTTP 的连接类型 3. HTTP 的状态码 (四…...
HarmonyOS 5 应用开发导读:从入门到实践
一、HarmonyOS 5 概述 HarmonyOS 5 是华为推出的新一代分布式操作系统,其核心设计理念是"一次开发,多端部署"。与传统的移动操作系统不同,HarmonyOS 5 提供了更强大的跨设备协同能力,支持手机、平板、智能穿戴、智慧屏…...
大数据治理:分析中的数据安全
引言 随着大数据技术在各行业的深度应用,海量数据蕴含的价值被不断挖掘。然而,数据规模的爆发式增长与分析场景的复杂化,使数据安全问题日益凸显。从数据泄露、隐私侵犯到非法访问,每一个安全漏洞都可能带来难以估量的损失。本文将…...

数字孪生技术赋能西门子安贝格工厂:全球智能制造标杆的数字化重构实践
在工业4.0浪潮席卷全球制造业的当下,西门子安贝格电子制造工厂(Electronic Works Amberg, EWA)凭借数字孪生技术的深度应用,构建起全球制造业数字化转型的典范。这座位于德国巴伐利亚州的“未来工厂”,通过虚实融合的数…...
国内高频混压PCB厂家有哪些?
一、技术领先型厂商(聚焦材料与工艺突破) 猎板PCB 技术亮点:真空层压工艺实现FR-4与罗杰斯高频材料(RO4350B/RO3003)混压,阻抗公差3%,支持64单元/板的5G天线模块,插损降低15%。 应用…...

【图像处理基石】立体匹配的经典算法有哪些?
1. 立体匹配的经典算法有哪些? 立体匹配是计算机视觉中从双目图像中获取深度信息的关键技术,其经典算法按技术路线可分为以下几类,每类包含若干代表性方法: 1.1 基于区域的匹配算法(Local Methods) 通过…...

day12 leetcode-hot100-19(矩阵2)
54. 螺旋矩阵 - 力扣(LeetCode) 1.模拟路径 思路:模拟旋转的路径 (1)设计上下左右方向控制器以及边界。比如zy1向右,zy-1向左;sx1向上,sx-1向下。上边界0,下边界hang-1&a…...