Redisson使用详解


一、Redisson 核心特性与适用场景

Redisson 是基于 Redis 的 Java 客户端,提供分布式对象、锁、集合和服务,简化分布式系统开发。
典型应用场景

  1. 分布式锁:防止重复扣款、超卖控制(如秒杀库存)。
  2. 数据共享:跨服务共享 Map、List、Set 等集合数据。
  3. 限流与异步任务:通过信号量(Semaphore)控制并发量,通过队列处理异步任务。
  4. 实时通信:基于发布订阅模式实现消息通知。

二、Redisson 快速集成

1. 依赖配置

Spring Boot 中引入依赖(建议选择最新稳定版本):

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version>
</dependency>
2. 配置类示例

配置单机模式 Redis 连接:

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

注:集群模式使用 useClusterServers(),哨兵模式使用 useSentinelServers()


三、核心功能详解

1. 基本数据结构操作

RBucket(键值对)

RBucket<String> bucket = redissonClient.getBucket("user:1");
bucket.set("张三");  // 存储字符串
String value = bucket.get();  // 读取值

RList(列表)

RList<String> list = redissonClient.getList("tasks");
list.add("task1");  // 添加元素

RMap(哈希表)

RMap<String, Integer> map = redissonClient.getMap("scores");
map.put("Alice", 90);  // 存储键值对
2. **分布式锁实现
2.1 可重入锁(RLock)
RLock lock = redissonClient.getLock("orderLock");
try {if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {  // 等待10秒,锁自动释放时间30秒// 执行业务逻辑}
} finally {lock.unlock();  // 释放锁
}

特性
看门狗机制:后台线程自动续期锁,防止业务未完成锁超时释放。
可重入性:同一线程可多次获取锁(计数器实现)。

2.2 其他锁类型

公平锁(FairLock):按请求顺序获取锁,避免饥饿问题。
联锁(MultiLock):同时获取多个锁,保证多资源操作的原子性。
红锁(RedLock):跨多个独立 Redis 节点实现高可用锁(需谨慎使用)。


四、高级功能与最佳实践

1. 信号量(Semaphore)

控制并发访问资源数量:

RSemaphore semaphore = redissonClient.getSemaphore("apiLimit");
semaphore.trySetPermits(100);  // 设置最大并发数
semaphore.acquire();          // 获取许可
// 执行业务
semaphore.release();          // 释放许可
2. 发布订阅模型
  • 发布消息:
RTopic topic = redissonClient.getTopic("news");
topic.publish("系统维护通知");
  • 订阅消息:
topic.addListener(String.class, (channel, msg) -> {System.out.println("收到消息:" + msg);
});

五、生产环境注意事项

  1. 连接池配置

    redisson:threads: 64nettyThreads: 32
    

    根据并发量调整线程数,避免资源争抢。

  2. 序列化优化
    默认使用 Kryo 编解码器,复杂对象建议使用 JSON 或 Protobuf。

  3. 异常处理

    • 锁释放前检查持有者:if (lock.isHeldByCurrentThread()) lock.unlock()
    • 网络波动时启用自动重连:config.useSingleServer().setRetryInterval(1500)

六、典型问题解决方案

  1. 锁续期失败:检查看门狗线程是否被阻塞(避免在锁内执行耗时操作)。
  2. Redis 集群切换主节点:Redisson 自动感知拓扑变化,需配置合理的超时时间。
  3. 内存泄漏:监控 RMap 等数据结构的使用,及时清理过期数据。

七、Lettuce与Redisson的区别

以下是 Lettuce 与 Redisson 的核心区别解析,结合功能特性、适用场景及设计理念,帮助开发者选择适合的 Redis 客户端:


设计目标与定位
维度LettuceRedisson
核心定位高性能、全功能的 Redis 命令客户端基于 Redis 的分布式中间件(内存数据网格)
设计理念提供底层 Redis 协议操作支持封装分布式功能(如锁、队列)
适用场景缓存、消息队列、简单数据结构操作分布式系统、微服务架构中的复杂业务逻辑
与 Redis 关系直接操作 Redis 命令基于 Redis 实现分布式服务抽象

关键差异
Lettuce 是纯粹的 Redis 客户端,专注于命令执行与性能优化;Redisson 是分布式服务框架,提供基于 Redis 的高级分布式功能。


核心功能对比
1. 线程安全与连接管理
  • Lettuce

    • 单连接线程安全,支持多线程共享连接(非阻塞操作下)。
    • 基于 Netty 的非阻塞 I/O,异步性能优异,适合高并发场景。
    • 需依赖外部连接池(如 Commons Pool2)。
  • Redisson

    • 内置线程安全分布式对象(如 RMapRList)。
    • 自动管理连接池,支持读写分离和负载均衡。
    • 提供“看门狗”机制保障锁续期,避免分布式锁超时失效。
2. 高级功能支持
  • Lettuce

    • 支持同步/异步/响应式编程,原生兼容 Redis 集群、哨兵、管道等特性。
    • 提供灵活的序列化配置(如 JSON、Protobuf)。
  • Redisson

    • 内置分布式锁、信号量(Semaphore)、延迟队列、分布式原子类等工具。
    • 支持与 Spring Session 集成实现分布式会话共享。
    • 提供 Tomcat Session Manager、Spring Cache 等扩展。
3. 性能与扩展性
维度LettuceRedisson
I/O 模型非阻塞异步(Netty)非阻塞异步(Netty)
吞吐量高(适合高频简单操作)较高(因功能复杂,略低于 Lettuce)
扩展性依赖外部实现复杂功能(如分布式锁需自行封装)开箱即用分布式功能

性能场景示例

  • 单节点 10 万 QPS 缓存查询:Lettuce 性能更优(轻量级命令执行)。
  • 分布式锁抢购场景:Redisson 更高效(内置锁续期与重试机制)。

适用场景推荐
1. 选择 Lettuce 的情况
  • 需要直接执行 Redis 命令(如 GET/SET)或使用原生数据结构。
  • 项目基于 Spring Boot 且无需复杂分布式功能。
  • 高并发场景下追求极致性能(如缓存击穿防护)。
2. 选择 Redisson 的情况
  • 需要分布式锁、延迟队列、分布式计数器等高级功能。
  • 微服务架构中需共享分布式对象(如跨服务共享 Map)。
  • 与 Spring Cloud 集成实现限流、熔断等治理需求。
3. 混合使用方案
  • Lettuce + Redisson
    • Lettuce 处理基础缓存操作(高性能)。
    • Redisson 管理分布式锁和集合(功能丰富)。
      • 示例配置:
    # Spring Boot 配置
    spring:redis:lettuce:pool:max-active: 50
    redisson:config: classpath:redisson.yaml
    

总结与建议
决策因素LettuceRedisson
开发效率高(简单命令)高(开箱即用功能)
学习成本较高(需掌握分布式概念)
性能优先级优先选择次要选择
功能丰富度基础全面

最终建议

  • 中小型项目:优先使用 Lettuce(Spring Boot 默认集成,维护简单)。
  • 分布式系统:必选 Redisson,或结合 Lettuce 补充基础操作。
  • 性能敏感型场景:Lettuce 作为主力,Redisson 仅用于必要功能。

参考资料

  • Redisson 官方文档

拓展

Lettuce使用详解

RedisTemplate使用详解

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

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

相关文章

从代码学习深度学习 - GRU PyTorch版

文章目录 前言一、GRU模型介绍1.1 GRU的核心机制1.2 GRU的优势1.3 PyTorch中的实现二、数据加载与预处理2.1 代码实现2.2 解析三、GRU模型定义3.1 代码实现3.2 实例化3.3 解析四、训练与预测4.1 代码实现(utils_for_train.py)4.2 在GRU.ipynb中的使用4.3 输出与可视化4.4 解析…

Flask学习笔记 - 项目结构 + 路由

前言 待业家中继续学习。 Flask 项目结构 my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── routes/ -- 将不同功能模块的路由分开管理 │ │ ├── __init__.py │ │ ├── main.py -- 主模块的路由 │ │ └── auth.py -- 认证相关的路…

SQL 转 PHP Eloquent、Doctrine ORM, 支持多数据库

SQL 转 PHP 说明 在 PHP 开发中&#xff0c;常使用 ORM&#xff08;如 Eloquent、Doctrine&#xff09;操作数据库。手写 ORM 模型繁琐&#xff0c;gotool.top 提供 SQL 转 PHP 工具&#xff0c;可自动生成 PHP 代码&#xff0c;提高开发效率。 特色 支持 Laravel Eloquent …

【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)

目录 Python 环境的下载安装第一步 进入官网第二步 找到匹配 windows 系统的 python 下载页面第三步 根据电脑 cpu 架构选择 python 版本第四步 安装 python 环境第五步 验证 python 环境变量 Pycharm 的下载安装第一步 进入官网第二步 安装 Pycharm Community Edition第三步 第…

基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

局域网:电脑或移动设备作为主机实现局域网访问

电脑作为主机 1. 启用电脑的网络发现、SMB功能 2. 将访问设备开启WIFI或热点&#xff0c;用此电脑连接&#xff1b;或多台设备连接到同一WIFI 3. 此电脑打开命令行窗口&#xff0c;查看电脑本地的IP地址 Win系统&#xff1a;输入"ipconfig"&#xff0c;回车后如图 4.…

use_tempaddr 笔记250405

use_tempaddr 笔记250405 use_tempaddr 是 Linux 系统中用于控制 IPv6 临时隐私地址生成策略 的关键参数。以下是其详细说明&#xff1a; &#x1f4dc; 参数定义 路径&#xff1a; /proc/sys/net/ipv6/conf/<接口>/use_tempaddr默认值&#xff1a; 1&#xff08;大多数…

NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)

区间问题是另⼀种⽐较经典的贪⼼问题。题⽬⾯对的对象是⼀个⼀个的区间&#xff0c;让我们在每个区间上做出取舍。 这种题⽬的解决⽅式⼀般就是按照区间的左端点或者是右端点排序&#xff0c;然后在排序之后的区间上&#xff0c;根据题⽬要求&#xff0c;制定出相应的贪⼼策略&…

用C语言控制键盘上的方向键

各位同学&#xff0c;大家好&#xff01;相信大家在学习C语言的过程中&#xff0c;都和我一样&#xff0c;经常使用scanf函数来接受字符&#xff0c;数字&#xff0c;这些标准输入信息&#xff0c;来实现自己设计的程序效果。 而我突然有一天&#xff08;对就是今天&#xff09…

特殊的质数肋骨--dfs+isp

1.dfs全排列组数&#xff0c;an记得还原 2.如果范围确定且只比较质数&#xff0c;isp比线性筛快&#xff0c;主要这个范围太大了 https://www.luogu.com.cn/problem/P1218 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typed…

定积分的应用(4.39-4.48)

battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 题目确实比较多。slow down and take your time. 4.39 狂算了一遍&#xff0c;然后发现不是计算出问题了&#xff0c;是积分上下限写错了。还有把函数代进去也出了一点问题。 点火公式一家人我不记得&#x…

如何高效使用 Ubuntu 中文官方网站

Ubuntu 中文官方网站 一、快速导航与核心模块 首页焦点区 顶部菜单栏:快速访问「下载」「文档」「支持」「商店」等核心功能。轮播图区:展示最新版本(如 Ubuntu 24.04 LTS)和特色功能(如 Ubuntu Pro 订阅服务)。搜索框:支持中文关键词搜索(如 "边缘计算"),…

form实现pdf文件转换成jpg文件

说明&#xff1a; 我希望将pdf文件转换成jpg文件 请去下载并安装 Ghostscript&#xff0c;gs10050w64.exe 配置环境变量&#xff1a;D:\Program Files\gs\gs10.05.0\bin 本地pdf路径&#xff1a;C:\Users\wangrusheng\Documents\name.pdf 输出文件目录&#xff1a;C:\Users\wan…

Spring 核心技术解析【纯干货版】- XVIII:Spring 网络模块 Spring-WebSocket 模块精讲

在现代 Web 开发中&#xff0c;实时通信已成为提升用户体验的关键技术之一。传统的 HTTP 轮询方式存在较高的延迟和带宽开销&#xff0c;而 WebSocket 作为一种全双工通信协议&#xff0c;能够在客户端和服务器之间建立持久连接&#xff0c;实现高效的双向数据传输。 Spring 框…

VirtualBox安装FnOS

1.下载FnOS镜像 下载网址&#xff1a; https://www.fnnas.com/2.创建虚拟机 虚拟机配置如图所示&#xff08;注意操作系统类型和网卡配置&#xff09; &#xff08;注意启动顺序&#xff09; 3.启动虚拟机 网卡类型选择桥接的Virtual Adapter 如果没有IP地址或者IP地址无法…

java根据集合中对象的属性值大小生成排名

1&#xff1a;根据对象属性降序排列 public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {Linked…

grep命令: 过滤

[rootxxx ~]# grep root /etc/passwd [rootxxx ~]# grep -A 2 root /etc/passwd -A #匹配行后两行 [rootxxx ~]# grep -B 2 root /etc/passwd -B #匹配行前两行 [rootxxx ~]# grep -C 2 root /etc/passwd -C #前后2行 [rootxxx ~]# grep -n root /…

二十种中药果实识别分类系统,Python/resnet18/pytorch

二十种中药果实识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 20类中药材具体包括&#xff1a;(1) 补骨脂&#xff0c;(2) 草豆蔻&#xff0c;(3) 川楝子&#xff0c;(4) 地肤子&…

SpringBoot启动run方法分析

SpringBoot启动run方法分析 1.场景引入 在项目启动的时候&#xff0c;有时候我们需要在启动的时候&#xff0c;执行一些逻辑。 比如说&#xff0c;项目启动的时候&#xff0c;我想把一些热门商品的数据加载到缓存中去&#xff1b; 比如说&#xff0c;自定义了一个netty服务…

Linux信号——信号的处理(3)

信号是什么时候被处理&#xff1f; 进程从内核态&#xff0c;切换到用户态的时候&#xff0c;信号会被检测处理。 内核态&#xff1a;操作系统的状态&#xff0c;权限级别高 用户态&#xff1a;你自己的状态 内核态和用户态 进程地址空间第三次 所谓的系统调用本质其实是一堆…