当前位置: 首页 > news >正文

【Redisson】redis最佳实践-RedissonUtils+Caffeine

RedissonUtils - 企业级 Redis 缓存工具库 - 二级缓存

  • 项目地址: hhttps://gitee.com/chen934298133/redisson-utils
  • 问题反馈: Issues
  • 邮箱: chen934298133@163.com

📖 项目简介

RedissonUtils 是一个基于 Redisson 的企业级 Redis 缓存工具库,提供了完整的缓存操作解决方案。该项目采用模块化设计,将不同类型的缓存操作分离到专门的工具类中,提供了简洁易用的 API 接口。

✨ 核心特性

  • 🚀 高性能: 基于 Redisson 客户端,支持异步操作和连接池
  • 🔧 模块化设计: 按功能分类的工具类,职责清晰
  • 💾 本地缓存: 集成 Caffeine 本地缓存,减轻 Redis 负担
  • 🔒 分布式锁: 完整的分布式锁解决方案
  • 📊 限流控制: 基于令牌桶的分布式限流
  • 🔄 原子操作: 支持原子计数器和原子值操作
  • 📦 集合操作: 完整的 List、Set、Map 缓存操作
  • 📨 消息队列: 支持发布订阅、阻塞队列、可靠队列、优先级队列等
  • 🎯 高级队列: 支持可靠队列(RReliableQueue)、优先级队列(RPriorityQueue)、传输队列(RTransferQueue)、环形缓冲区(RRingBuffer)
  • 现代化 API: 使用 Duration 替代过时的 TimeUnit

🏗️ 架构设计

RedissonUtils (主入口)
├── RedissonObjectUtils      # 基础对象缓存操作
├── RedissonCollectionUtils  # 集合类型缓存操作
├── RedissonLockUtils        # 分布式锁操作
├── RedissonAtomicUtils      # 原子操作
├── RedissonQueueUtils       # 队列和消息操作
├── RedissonRateLimiterUtils # 限流操作
└── RedissonLocalCacheUtils  # 本地缓存管理

🚀 快速开始

1. 添加依赖

<dependency><groupId>org.nehc.algorithm</groupId><artifactId>redisson-utils</artifactId><version>1.0.0</version>
</dependency>

2. 配置 Redisson

# application.yml
spring:redis:host: localhostport: 6379password: your_passworddatabase: 0

3. 基本使用

// 基础缓存操作
RedissonObjectUtils.setCacheObject("user", "123", userObject, Duration.ofHours(1));
User user = RedissonObjectUtils.getCacheObject("user", "123");// 分布式锁
if (RedissonLockUtils.tryLock("order", "123", Duration.ofSeconds(10), Duration.ofMinutes(1))) {try {// 业务逻辑} finally {RedissonLockUtils.unLock("order", "123");}
}// 限流控制
if (RedissonRateLimiterUtils.tryAcquire("api:user:123")) {// 执行业务逻辑
}// 可靠队列操作
RedissonQueueUtils.addReliableQueueMessage("task_queue", taskMessage);
List<Message> messages = RedissonQueueUtils.pollReliableQueueMessage("task_queue", 5);
RedissonQueueUtils.acknowledgeMessage("task_queue", messageId);// 优先级队列操作
RedissonQueueUtils.addPriorityQueueElement("priority_queue", priorityTask);
Task task = RedissonQueueUtils.pollPriorityQueueElement("priority_queue");// 环形缓冲区操作
RedissonQueueUtils.setRingBufferCapacity("metrics", 1000);
RedissonQueueUtils.addRingBufferElement("metrics", metricData);

📚 API 文档

RedissonObjectUtils - 基础对象操作

📋 查看完整测试用例

方法描述示例
setCacheObject(cacheName, key, value)设置缓存对象setCacheObject("user", "123", user)
setCacheObject(cacheName, key, value, duration)设置带过期时间的缓存setCacheObject("user", "123", user, Duration.ofHours(1))
getCacheObject(cacheName, key)获取缓存对象getCacheObject("user", "123")
deleteObject(cacheName, key)删除缓存对象deleteObject("user", "123")
isExistsObject(cacheName, key)判断缓存是否存在isExistsObject("user", "123")
expire(cacheName, key, duration)设置过期时间expire("user", "123", Duration.ofHours(2))

RedissonLockUtils - 分布式锁操作

📋 查看完整测试用例

方法描述示例
tryLock(cacheName, key, waitTime, leaseTime)尝试获取锁tryLock("order", "123", Duration.ofSeconds(5), Duration.ofMinutes(1))
tryLock(cacheName, key, timeoutMills)尝试获取锁(毫秒)tryLock("order", "123", 5000)
unLock(cacheName, key)释放锁unLock("order", "123")
isLocked(cacheName, key)判断是否被锁定isLocked("order", "123")
forceUnlock(cacheName, key)强制释放锁forceUnlock("order", "123")

RedissonRateLimiterUtils - 限流操作

📋 查看完整测试用例

方法描述示例
initRateLimiter(key, rateType, rate, rateInterval)初始化限流器initRateLimiter("api:user", RateType.OVERALL, 100, Duration.ofMinutes(1))
tryAcquire(key)尝试获取许可tryAcquire("api:user:123")
tryAcquire(key, permits)尝试获取指定数量许可tryAcquire("api:user:123", 5)
availablePermits(key)获取可用许可数availablePermits("api:user:123")

RedissonAtomicUtils - 原子操作

📋 查看完整测试用例

方法描述示例
setAtomicValue(cacheName, key, value)设置原子值setAtomicValue("counter", "page_view", 1000)
getAtomicValue(cacheName, key)获取原子值getAtomicValue("counter", "page_view")
incrAtomicValue(cacheName, key)原子递增incrAtomicValue("counter", "page_view")
decrAtomicValue(cacheName, key)原子递减decrAtomicValue("counter", "page_view")

RedissonCollectionUtils - 集合操作

📋 查看完整测试用例

List 操作
方法描述示例
setCacheList(cacheName, key, list)设置 List 缓存setCacheList("user", "friends:123", friendsList)
getCacheList(cacheName, key)获取 List 缓存getCacheList("user", "friends:123")
listRightPush(cacheName, key, value, maxSize)右侧添加元素listRightPush("log", "user:123", logEntry, 1000)
Set 操作
方法描述示例
setCacheSet(cacheName, key, set)设置 Set 缓存setCacheSet("user", "tags:123", tagsSet)
getCacheSet(cacheName, key)获取 Set 缓存getCacheSet("user", "tags:123")
Map 操作
方法描述示例
setCacheMap(cacheName, key, map)设置 Map 缓存setCacheMap("user", "profile:123", profileMap)
getCacheMap(cacheName, key)获取 Map 缓存getCacheMap("user", "profile:123")
setCacheMapValue(cacheName, key, hKey, value)设置 Map 中的值setCacheMapValue("user", "profile:123", "name", "张三")
getCacheMapValue(cacheName, key, hKey)获取 Map 中的值getCacheMapValue("user", "profile:123", "name")

RedissonQueueUtils - 队列和消息操作

📋 查看完整测试用例

基础队列操作
方法描述示例
addQueueObject(queueName, data)添加队列元素addQueueObject("task_queue", taskData)
pollQueueObject(queueName)获取并移除队列头部元素pollQueueObject("task_queue")
publish(channelKey, message)发布消息publish("user:notification", notification)
subscribe(channelKey, clazz, consumer)订阅消息subscribe("user:notification", Notification.class, this::handleNotification)
可靠队列 (RReliableQueue) 操作
方法描述示例
getReliableQueue(queueName)获取可靠队列实例getReliableQueue("reliable_task_queue")
setReliableQueueConfig(queueName, config)设置可靠队列配置setReliableQueueConfig("queue", config)
addReliableQueueMessage(queueName, message)添加可靠队列消息addReliableQueueMessage("queue", message)
pollReliableQueueMessage(queueName, count)批量获取可靠队列消息pollReliableQueueMessage("queue", 10)
acknowledgeMessage(queueName, messageId)确认消息处理完成acknowledgeMessage("queue", "msg123")
rejectMessage(queueName, messageId)拒绝消息并移至死信队列rejectMessage("queue", "msg123")
isReliableQueueEmpty(queueName)检查可靠队列是否为空isReliableQueueEmpty("queue")
getReliableQueueSize(queueName)获取可靠队列大小getReliableQueueSize("queue")
优先级队列 (RPriorityQueue) 操作
方法描述示例
getPriorityQueue(queueName)获取优先级队列实例getPriorityQueue("priority_task_queue")
addPriorityQueueElement(queueName, element)添加优先级队列元素addPriorityQueueElement("queue", task)
pollPriorityQueueElement(queueName)获取并移除最高优先级元素pollPriorityQueueElement("queue")
peekPriorityQueueElement(queueName)查看最高优先级元素peekPriorityQueueElement("queue")
传输队列 (RTransferQueue) 操作
方法描述示例
getTransferQueue(queueName)获取传输队列实例getTransferQueue("transfer_queue")
transferElement(queueName, element)传输元素到等待的消费者transferElement("queue", data)
tryTransferElement(queueName, element)尝试传输元素tryTransferElement("queue", data)
hasWaitingConsumer(queueName)检查是否有等待的消费者hasWaitingConsumer("queue")
环形缓冲区 (RRingBuffer) 操作
方法描述示例
getRingBuffer(bufferName)获取环形缓冲区实例getRingBuffer("ring_buffer")
setRingBufferCapacity(bufferName, capacity)设置环形缓冲区容量setRingBufferCapacity("buffer", 1000)
addRingBufferElement(bufferName, element)添加元素到环形缓冲区addRingBufferElement("buffer", data)
getRingBufferCapacity(bufferName)获取环形缓冲区容量getRingBufferCapacity("buffer")
getRingBufferRemainingCapacity(bufferName)获取剩余容量getRingBufferRemainingCapacity("buffer")

RedissonLocalCacheUtils - 本地缓存管理

📋 查看完整测试用例

方法描述示例
getOrCreateCache(cacheName, maxSize, expireAfterWrite, expireAfterAccess)创建本地缓存getOrCreateCache("user", 1000, Duration.ofMinutes(30), Duration.ofMinutes(10))
set(key, value)设置本地缓存set("user:123", user)
get(key)获取本地缓存get("user:123")

🔧 高级配置

缓存域配置

public enum CacheScope {APPLICATION("app"),     // 应用级缓存SESSION("session"),     // 会话级缓存USER("user"),          // 用户级缓存TEMP("temp");          // 临时缓存private final String cacheName;
}

本地缓存配置

// 自定义本地缓存配置
Cache<String, Object> customCache = RedissonLocalCacheUtils.getOrCreateCache("custom", 5000,                           // 最大缓存数量Duration.ofMinutes(30),         // 写入后过期时间Duration.ofMinutes(10)          // 访问后过期时间
);

🎯 最佳实践

1. 缓存键命名规范

// 推荐的命名方式
RedissonObjectUtils.setCacheObject("user", "profile:123", userProfile);
RedissonObjectUtils.setCacheObject("order", "detail:456", orderDetail);

2. 分布式锁使用

// 推荐的锁使用模式
String lockKey = "order:" + orderId;
if (RedissonLockUtils.tryLock("business", lockKey, Duration.ofSeconds(5), Duration.ofMinutes(1))) {try {// 执行需要同步的业务逻辑processOrder(orderId);} finally {RedissonLockUtils.unLock("business", lockKey);}
} else {throw new BusinessException("系统繁忙,请稍后重试");
}

3. 限流配置

// API 限流示例
String rateLimiterKey = "api:" + apiPath + ":" + userId;// 初始化限流器:每分钟最多 100 次请求
RedissonRateLimiterUtils.initRateLimiter(rateLimiterKey, RateType.OVERALL, 100, Duration.ofMinutes(1)
);// 检查限流
if (!RedissonRateLimiterUtils.tryAcquire(rateLimiterKey)) {throw new RateLimitException("请求过于频繁,请稍后重试");
}

4. 缓存过期策略

// 不同类型数据的推荐过期时间
RedissonObjectUtils.setCacheObject("user", "profile:" + userId, userProfile, Duration.ofHours(2));     // 用户信息
RedissonObjectUtils.setCacheObject("config", "system", systemConfig, Duration.ofMinutes(30));          // 系统配置
RedissonObjectUtils.setCacheObject("temp", "captcha:" + sessionId, captcha, Duration.ofMinutes(5));     // 验证码

5. 队列使用最佳实践

// 可靠队列使用示例
String queueName = "order_processing";// 配置可靠队列
QueueConfigParams config = QueueConfigParams.defaults().maxSize(10000).messageMaxSize(1024 * 1024)  // 1MB.messageExpiration(Duration.ofHours(24)).visibilityTimeout(Duration.ofMinutes(5)).deliveryLimit(3);RedissonQueueUtils.setReliableQueueConfig(queueName, config);// 生产者:添加消息
OrderTask task = new OrderTask(orderId, userId);
RedissonQueueUtils.addReliableQueueMessage(queueName, task);// 消费者:处理消息
List<Message> messages = RedissonQueueUtils.pollReliableQueueMessage(queueName, 10);
for (Message message : messages) {try {// 处理业务逻辑processOrder(message.getPayload());// 确认消息处理完成RedissonQueueUtils.acknowledgeMessage(queueName, message.getId());} catch (Exception e) {// 处理失败,拒绝消息RedissonQueueUtils.rejectMessage(queueName, message.getId());log.error("处理订单失败: {}", message.getId(), e);}
}
// 优先级队列使用示例
String priorityQueueName = "task_priority_queue";// 添加不同优先级的任务
RedissonQueueUtils.addPriorityQueueElement(priorityQueueName, new PriorityTask("urgent", 1));
RedissonQueueUtils.addPriorityQueueElement(priorityQueueName, new PriorityTask("normal", 5));
RedissonQueueUtils.addPriorityQueueElement(priorityQueueName, new PriorityTask("low", 10));// 按优先级处理任务
PriorityTask task = RedissonQueueUtils.pollPriorityQueueElement(priorityQueueName);
if (task != null) {processTask(task);
}
// 环形缓冲区使用示例
String bufferName = "metrics_buffer";// 设置缓冲区容量
RedissonQueueUtils.setRingBufferCapacity(bufferName, 1000);// 添加指标数据(自动覆盖旧数据)
Metric metric = new Metric("cpu_usage", 85.5, System.currentTimeMillis());
RedissonQueueUtils.addRingBufferElement(bufferName, metric);// 检查剩余容量
long remaining = RedissonQueueUtils.getRingBufferRemainingCapacity(bufferName);
log.info("缓冲区剩余容量: {}", remaining);

🔍 监控和调试

缓存统计

// 获取本地缓存统计信息
CacheStats stats = RedissonLocalCacheUtils.stats();
log.info("缓存命中率: {}", stats.hitRate());
log.info("缓存大小: {}", RedissonLocalCacheUtils.size());

锁状态检查

// 检查锁状态
boolean isLocked = RedissonLockUtils.isLocked("business", lockKey);
boolean isHeldByCurrentThread = RedissonLockUtils.isHeldByCurrentThread("business", lockKey);
long remainTime = RedissonLockUtils.remainTimeToLive("business", lockKey);

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

📞 联系方式

  • 项目地址: hhttps://gitee.com/chen934298133/redisson-utils
  • 问题反馈: Issues
  • 邮箱: chen934298133@163.com

🙏 致谢

感谢以下开源项目的支持:

  • Redisson - Redis Java 客户端
  • Caffeine - 高性能本地缓存
  • Spring Boot - 应用框架

⭐ 如果这个项目对你有帮助,请给我们一个 Star!

http://www.dtcms.com/a/352240.html

相关文章:

  • 【机器人】2025年人形机器人看护革命:AI驱动的医疗变革先锋
  • 小知识-为什么处理异步数据渲染需要async await 搭配Promise.all实现?
  • 昆仑资本完成对国产工业操作系统龙头企业光亚鸿道的投资
  • MYSQL递归
  • mysql优化-mysql索引下推
  • Python 将十进制转换为十六进制
  • Linux命令详解+示例(炫彩超全)
  • 2025秋招季:AI笔试破解大规模招聘难题
  • MySQL 面试题系列(四)
  • Pandas 分组聚合进阶:过滤与 apply
  • 【人工智能】神经网络的优化器optimizer(三):RMSProp动态自适应学习率优化器
  • java自定义注解实现
  • 开发electron时候Chromium 报 Not allowed to load local resource → 空白页。
  • 在使用spring ai进行llm处理的rag的时候,选择milvus还是neo4j呢?
  • gorm 枚举查询遇到的问题
  • 【Python】Python日志模块完全指南:从配置到常见错误排查
  • 深入OpenHarmony后台任务“黑匣子”:BackgroundTaskMgr框架全栈解析与实战避坑指南
  • C#编程:贪吃蛇游戏
  • 使用linux+javascript+html+mysql+nodejs+npm+express等构建信息资料采集系统
  • FreeRTOS 同步互斥与任务协作 学习笔记
  • 【Protues仿真】定时器
  • 对讲联动电梯门禁系统通过深度集成对讲、梯控、身份认证三大模块,在提升便捷性的同时,以“权限后置发放+电梯状态闭环检测“为核心,实现安全性与可靠性的双重突破。
  • 解决VSCode无法下载服务器端 Server问的题
  • 当 C++ 用于嵌入式开发:优点和缺点
  • .gitignore 文件相关使用配置
  • 【Redis】安装和基础命令
  • 十、Java面向对象编程入门指南:继承与多态
  • 利用 OpenTelemetry 建设尾部采样
  • 大模型全栈学习路线:4 - 6 个月从入门到实战,打通技术与业务闭环
  • [灵动微电子 霍尔FOC MM32BIN560C]从引脚到应用