Redisson使用详解

news2025/4/9 7:26:36

一、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 {
    @Bean
    public 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: 64
      nettyThreads: 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.coloradmin.cn/o/2329610.html

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

相关文章

MySQL基础 [一] - 数据库基础

目录 什么是数据库 站在服务器角度理解 站在用户角度理解 为什么不直接使用文件存储呢&#xff1f; 主流数据库 MySQL的基本使用 数据库的使用样例 服务器管理 服务器数据库表之间的关系 MySQL的架构 MySQL语句分类 存储引擎 查看存储引擎 存储引擎对比 什么…

【华为OD技术面试真题 - 技术面】- Java面试题(17)

华为OD面试真题精选 专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录 文章目录 华为OD面试真题精选虚拟机分区1. **虚拟磁盘分区**2. **虚拟机的内存分区**3. **CPU分配**4. **虚拟网络分区**5. **存储虚拟化和分区**6. **虚拟机分区管理**…

#Linux内存管理# 在32bit Linux中,内核空间的线性映射的虚拟地址和物理地址是如何换算的?

在32位Linux系统中&#xff0c;内核空间的线性映射&#xff08;也称为直接映射或低端内存映射&#xff09;采用固定的偏移量进行虚拟地址和物理地址的换算。以下是详细的转换规则及背景知识&#xff1a; 1. 32位Linux内存布局 用户空间&#xff1a;虚拟地址 0x00000000 到 0x…

006贪心——算法备赛

跨步问题 跳跃游戏|| 问题描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j &…

pytorch中Dropout

Dropout 是一种常用的正则化技术&#xff0c;用于防止神经网络过拟合。PyTorch 提供了 nn.Dropout 层来实现这一功能。 基本用法 torch.nn.Dropout(p0.5, inplaceFalse) 参数说明&#xff1a; p (float): 每个元素被置为0的概率&#xff08;默认0.5&#xff09; inplace (b…

【玩泰山派】2、制作buildroot镜像,并烧录

文章目录 前言制作buildroot镜像过程搭建环境&#xff08;docker版&#xff09;下载泰山派开发的sdk利用制作的镜像和下载的sdk去启动开发docker容器编译buildroot镜像 参考 前言 泰山派官方提供了不少现成的镜像 但是都买了泰山派了&#xff0c;肯定是想自己编译折腾下&…

初阶数据结构--树

1. 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 有⼀个特殊的结点&#xff0c;称…

安装gpu版本的dgl

1.先去网址&#xff0c;找到对应版本的dgl,然后下载到本地。 dgl-whl下载地址 我的是python 3.8 &#xff0c;cuda 11.6. windows 2.在虚拟环境里 输入 pip install E:\dgl-1.0.2cu116-cp38-cp38-win_amd64.whl &#xff08;因为我下载到E盘里了&#xff09; 这样GPU版本的d…

5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)

嗨&#xff0c;朋友们&#xff01;&#x1f44b; 是不是感觉AI浪潮铺天盖地&#xff0c;身边的人都在谈论AI Agent、大模型&#xff0c;而你看着那些密密麻麻的代码&#xff0c;感觉像在读天书&#xff1f;&#x1f92f; 别焦虑&#xff01;你不是一个人。很多人都想抓住AI的风…

FPGA——FPGA状态机实现流水灯

一、引言 在FPGA开发中&#xff0c;状态机是一种重要的设计工具&#xff0c;用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。 二、状态机概述 状态机&#xff08;FSM&#xff09;是一种行为模型&#xff0c;用于表示系统在不同状态下的…

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 刷机工具版本请用2.2.0以上&#xff0c;导入固件后&#xff0c;刷机工具右侧两个擦除打勾&#xff0c;然后点开始。插上刷机神器&#xf…

构建第一个ArkTS应用:Hello World之旅

# 构建第一个ArkTS应用&#xff1a;Hello World之旅 在鸿蒙应用开发的领域中&#xff0c;ArkTS语言为我们提供了强大而便捷的开发方式。今天&#xff0c;就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先&#xff0c;我们要使用…

第十五届单片机模拟考试III

题目 题目不长 &#xff0c;功能也不难&#xff0c;一道水题 按键功能 S4界面切换&#xff0c;S5 功能切换&#xff0c;在不同界面转换不同的功能&#xff0c;定义两个标志位记录即可。 S9复位&#xff0c;回到初始状态&#xff0c;记得界面也得回到初始的信号界面&#xff0…

测试:正交法设计测试用例

目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量&#xff0c;让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3)&#xff0c;含意如下&#xff1a; “L”代表正…

[ctfshow web入门] web5

前置知识 引用博客&#xff1a;phps的利用 当服务器配置了 .phps 文件类型时&#xff0c;访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码&#xff0c;而不是执行它。.phps被作为辅助开发者的一种功能&#xff0c;开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …

Qt基本框架(2)

本篇主要介绍如何设置窗口&#xff0c;以及在窗口中添加按钮 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类&#xff0c;通过合理设计…

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

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

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏&#xff0c;曾经风靡一时。今天&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…

JVM——模型分析、回收机制

方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 虚拟机栈&#xff1a;虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言&#xff1a;当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份&#xff0c;每次对话都要求重复验证&#xff0c;引发大量投诉。引入LangChain 记忆系统后&#xff0c;客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储&#xff0c;教你构建符合…