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

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录

  • 1.前言
  • 2.使用方式
    • 1. 添加Redisson依赖:
    • 2. 配置Redis连接信息
    • 3. 使用场景
      • 3.1. 分布式锁
      • 3.2. 限流器(Rate Limiter)
      • 3.3. 可过期的对象(Expirable Object)
      • 3.4. 信号量(Semaphore)
      • 3.5. 分布式调度器(Distributed Scheduler)
  • 5. 源码地址
  • 6. Redis从入门到精通系列文章
  • 7.参考文档

在这里插入图片描述

1.前言

Redisson是一个基于Redis的分布式Java对象和数据结构库,它提供了丰富的功能和易于使用的API,使开发人员能够轻松地在分布式环境中操作和管理数据。

作为一个分布式对象和数据结构库,Redisson提供了许多常见的数据结构和算法的实现,包括通用对象桶、二进制流、地理空间对象桶、BitSet、原子长整型、原子双精度浮点数、话题(订阅分发)、布隆过滤器和基数估计算法。这些数据结构和算法为开发人员提供了处理分布式数据的工具,从而简化了复杂性,提高了效率。简直就是一个Redis的最佳实践框架和最牛X的Redis客户端工具宝箱,基本上覆盖了所有场景

通过Redisson,开发人员可以使用简单而一致的API来存储和检索对象,处理二进制数据,管理地理位置信息,操作位集合,进行原子操作,进行发布-订阅消息传递,实现布隆过滤器和基数估计等功能。Redisson还提供了许多附加功能,如分布式锁、分布式信号量、分布式队列和分布式限流器等,进一步增强了分布式应用的能力。

Redisson的设计目标是提供高性能、可扩展和可靠的分布式数据操作解决方案。它与Redis数据库紧密集成,并利用Redis的特性来实现分布式对象和数据结构的存储和管理。Redisson还支持与Spring框架的无缝集成,使开发人员能够更方便地在Spring应用程序中使用Redisson功能。

所以我们本篇文章了解一下Redisson 在项目实践中最常用的5种场景,分别搞了一个示例方便大家理解
在这里插入图片描述

2.使用方式

1. 添加Redisson依赖:

在Spring Boot项目的pom.xml文件中添加Redisson的依赖。

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.5</version>
</dependency>

2. 配置Redis连接信息

在Spring Boot项目的application.properties或application.yml文件中配置Redis连接信息,包括主机地址、端口、密码等。例如:

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

3. 使用场景

3.1. 分布式锁

例如,你可以在Spring Boot的Service类中注入RedissonClient并使用它进行操作:

import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate RedissonClient redissonClient;public void myMethod() {// 获取分布式锁RLock lock = redissonClient.getLock("myLock");try {// 尝试加锁,如果加锁成功,则执行加锁后的逻辑if (lock.tryLock()) {// 执行加锁后的逻辑// ...}} finally {// 释放锁lock.unlock();}}}

3.2. 限流器(Rate Limiter)

import org.redisson.api.RRateLimiter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyService {@Autowiredprivate   RedissonClient redissonClient;public void myMethod() {// 获取限流器RRateLimiter limiter = redissonClient.getRateLimiter("myLimiter");// 定义限流速率,例如每秒最多允许10个操作limiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);// 尝试获取许可boolean acquired = limiter.tryAcquire();if (acquired) {// 执行需要限流的操作// ...} else {// 限流逻辑,例如返回错误信息或执行降级处理// ...}}
}

3.3. 可过期的对象(Expirable Object)

在Redis中,Hash结构是一种用于存储键值对的数据结构。每个Hash结构都可以包含多个字段(field)和对应的值(value)。而要为Hash结构中的二级key设置过期时间,可以使用Redisson的RMapCache接口。如果使用Redisson 来实现对Hash结构中二级key的值设置过期时间,其实很简单了。

我们使用redissonClient.getMapCache("myHash")获取一个名为"myHash"的可过期对象的Hash结构。然后,我们可以使用put()方法将具有过期时间的二级键值对存储到Hash结构中,并指定过期时间和时间单位。存储的二级键值对将会在指定的过期时间后自动过期。

setHashValueWithExpiration()方法中,我们传入Hash结构的一级键(hashKey)、二级键(fieldKey)、值(value)、过期时间和时间单位,将值存储到Hash结构中的二级键,并为其设置过期时间。

getHashValue()方法中,我们根据Hash结构的一级键和二级键从Hash结构中获取对应的值。

通过使用Redisson的RMapCache接口,你可以方便地为Hash结构中的二级键值对设置过期时间,并且无需手动处理过期逻辑。Redisson会自动管理过期和清理操作,简化了在分布式环境中使用可过期的Hash结构的开发工作。

import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class HashService {@Autowiredprivate  RedissonClient redissonClient;public void setHashValueWithExpiration(String hashKey, String fieldKey, Object value, long expirationTime, TimeUnit timeUnit) {RMapCache<String, Object> hash = redissonClient.getMapCache("myHash");hash.put(hashKey, fieldKey, value, expirationTime, timeUnit);}public Object getHashValue(String hashKey, String fieldKey) {RMapCache<String, Object> hash = redissonClient.getMapCache("myHash");return hash.get(hashKey, fieldKey);}
}

3.4. 信号量(Semaphore)

redissonClient.getSemaphore(“mySemaphore”)获取一个名为"mySemaphore"的信号量。然后,使用trySetPermits()方法设置信号量的初始数量,例如设置为10个。在myMethod()方法中,我们使用acquire()方法尝试获取信号量,如果获取到信号量,则执行需要受信号量限制的操作。在操作完成后,使用release()方法释放信号量。

  • 通过使用Redisson的信号量功能,你可以控制在分布式环境中对某个资源的并发访问数量,限制并发访问的能力,从而保护资源的稳定性和可用性。
import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class ResourceService {private final RedissonClient redissonClient;@Autowiredpublic ResourceService(RedissonClient redissonClient) {this.redissonClient = redissonClient;}public void accessResource() {RSemaphore resourceSemaphore = redissonClient.getSemaphore("resourceSemaphore");resourceSemaphore.trySetPermits(10);try {resourceSemaphore.acquire();// 执行需要受信号量限制的操作,访问资源// ...} catch (InterruptedException e) {// 处理中断异常// ...} finally {resourceSemaphore.release();}}
}

3.5. 分布式调度器(Distributed Scheduler)

我们使用redissonClient.getMapCache("myHash")获取一个名为"myHash"的可过期对象的Hash结构。然后,我们可以使用put()方法将具有过期时间的二级键值对存储到Hash结构中,并指定过期时间和时间单位。存储的二级键值对将会在指定的过期时间后自动过期。

setHashValueWithExpiration()方法中,我们传入Hash结构的一级键(hashKey)、二级键(fieldKey)、值(value)、过期时间和时间单位,将值存储到Hash结构中的二级键,并为其设置过期时间。

getHashValue()方法中,我们根据Hash结构的一级键和二级键从Hash结构中获取对应的值。

通过使用Redisson的RMapCache接口,你可以方便地为Hash结构中的二级键值对设置过期时间,并且无需手动处理过期逻辑。Redisson会自动管理过期和清理操作,简化了在分布式环境中使用可过期的Hash结构的开发工作。

import org.redisson.api.RScheduledExecutorService;
import org.redisson.api.RedissonClient;
import org.redisson.api.annotation.RInject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class DistributedScheduler {private final RedissonClient redissonClient;@Autowiredpublic DistributedScheduler(RedissonClient redissonClient) {this.redissonClient = redissonClient;}/*** 安排一个延迟执行的分布式任务** @param task      要执行的任务* @param delay     延迟时间* @param timeUnit  时间单位*/public void scheduleTask(Runnable task, long delay, TimeUnit timeUnit) {RScheduledExecutorService executorService = redissonClient.getExecutorService("myScheduler");executorService.schedule(task, delay, timeUnit);}/*** 安排一个以固定速率重复执行的分布式任务** @param task          要执行的任务* @param initialDelay  初始延迟时间* @param period        重复执行的周期* @param timeUnit      时间单位*/public void scheduleTaskAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit timeUnit) {RScheduledExecutorService executorService = redissonClient.getExecutorService("myScheduler");executorService.scheduleAtFixedRate(task, initialDelay, period, timeUnit);}
}

5. 源码地址

https://github.com/wangshuai67/Redis-Tutorial-2023

6. Redis从入门到精通系列文章

  • 《Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性》
  • 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
  • 《Redis【应用篇】之RedisTemplate基本操作》
  • 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
  • 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
  • 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
  • 《Redis 从入门到精通【进阶篇】之Redis事务详解》
  • 《Redis从入门到精通【进阶篇】之对象机制详解》
  • 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
  • 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
  • 《Redis从入门到精通【进阶篇】之持久化RDB详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
  • 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》
    在这里插入图片描述大家好,我是冰点,今天的【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

7.参考文档

Redisson官方文档 https://github.com/redisson/redisson/wiki/Table-of-Content

相关文章:

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录 1.前言2.使用方式1. 添加Redisson依赖&#xff1a;2. 配置Redis连接信息3. 使用场景3.1. 分布式锁3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可过期的对象&#xff08;Expirable Object&#xff09;3.4. 信号量&#xff08;Semaphore&#xff09;3.5. 分布…...

污水处理厂人员定位方案介绍

污水处理厂人员定位在现代化的污水处理厂中具有重要的意义&#xff0c;它可以带来多方面的优势和好处&#xff1a; 安全管理&#xff1a; 污水处理厂通常涉及到各种危险环境和设备&#xff0c;如化学品、高压设备等。人员定位系统可以追踪人员的位置&#xff0c;确保他们不会进…...

约数个数(质因子分解)

思路&#xff1a; &#xff08;1&#xff09;由数论基本定理&#xff0c;任何一个正整数x都能写作&#xff0c;其中p1,p2..pk为x的质因子。 &#xff08;2&#xff09;由此可以推断&#xff0c;要求一个数约数的个数&#xff0c;注意到约数就是p1,p2...pk的一种组合&#xff…...

【QT】 QSS样式表设计一文了解

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT界面设计中的QSS样式技术&#xff0c;主要从**、**和**方面展开&#xff0c;希望对各位小伙伴有所帮助&#xff01;学会了QSS样式设计&#xff0c;就可以开动你的审美&#…...

9-AJAX-1入门

AJAX 目录 AJAX 概念和 axios 使用认识 URLURL 查询参数常用请求方法和数据提交HTTP协议-报文接口文档案例 - 用户登录form-serialize 插件 01.AJAX 概念和 axios 使用 目标 了解 AJAX 概念并掌握 axios 库基本使用 讲解 什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest…...

ssh免密登录

客户端 第一步&#xff1a;生成密钥 ssh-keygen -t rsa 第二步&#xff1a;从“~/.ssh/id_rsa.pub”拷贝公钥 服务器端 填写公钥 打开authorized_keys&#xff0c;并把刚刚的公钥填进去 重启服务 sudo systemctl restart sshd...

全球公链周进展-2023/8/14

Tokenview每周周一准时更新全球公链最新进展&#xff0c;致力于为全球公链爱好者整合最新项目进展。 过去一周&#xff0c;明星项目动态如下&#xff1a; 第 115 次以太坊核心开发者共识会议总结 以太坊客户端 Geth v1.12.1版本发布&#xff0c;聚焦Cancun硬分叉 以太坊Holesk…...

python装饰器详解,python装饰器笔记心得

装饰器 装饰器是程序开发中经常会用到的一个功能&#xff0c;用好了装饰器&#xff0c;开发效率如虎添翼&#xff0c;所以这也是Python面试中必问的问题。但对于好多初次接触这个知识的人来讲&#xff0c;这个功能有点绕&#xff0c;自学时直接绕过去了&#xff0c;然后面试问…...

【C语言】每日一题(寻找数组的中心下标)

寻找数组的中心下标&#xff0c;链接奉上 方法 暴力循环前缀和 暴力循环 ​​​​​​​思路&#xff1a; 依旧是我们的老朋友&#xff0c;暴力循环。 1.可以利用外层for循环&#xff0c;循环变量为数组下标&#xff0c;在循环内分别求出下标左边与右边的sum 2.在边界时讨论&…...

centos 安装 nginx配置ssl 和 获取用户真实ip

安装所需环境 nginx 是用 C语言开发的&#xff0c;建议在Linux上使用&#xff0c;如果是windows用户&#xff0c;也可以使用windows版本。 一. gcc 安装 安装 nginx 需要先将官网下载的源码进行编译&#xff0c;编译依赖 gcc 环境&#xff0c;如果有 gcc 环境&#xff0c;则不…...

RocketMQ 消息消费 轮询机制 PullRequestHoldService

1. 概述 先来看看 RocketMQ 消费过程中的轮询机制是啥。首先需要补充一点消费相关的前置知识。 1.1 消息消费方式 RocketMQ 支持多种消费方式&#xff0c;包括 Push 模式和 Pull 模式 Pull 模式&#xff1a;用户自己进行消息的拉取和消费进度的更新Push 模式&#xff1a;Broker…...

springboot 数据库版本升级管理常用解决方案

目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题 三、spring 框架sql自动管理机制 3.1 jdbcTemplate 方式 3.1.1 创建数据库 3.1.2 创建 springboot 工程 3.1.3 初始化sql脚本 3.1.4 核心配置类 3.1.5 执行sql初始化 3.2 配置文…...

78. 子集

题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2…...

Mask RCNN网络结构以及整体流程的详细解读

文章目录 1、概述2、Backbone3、RPN网络3.1、anchor的生成3.2、anchor的标注/分配3.3、分类预测和bbox回归3.4、NMS生成最终的anchor 4、ROI Head4.1、ROI Align4.2、cls head和bbox head4.3、mask head 1、概述 Mask RCNN是在Faster RCNN的基础上增加了mask head用于实例分割…...

Android Framework底层原理之WMS的启动流程

一 概述 今天&#xff0c;我们介绍 WindowManagerService&#xff08;后续简称 WMS&#xff09;的启动流程&#xff0c;WMS 是 Android 系统中&#xff0c;负责窗口显示的的服务。在 Android 中它也起着承上启下的作用。 如下图&#xff0c;就是《深入理解 Android》书籍中的…...

Leaflet入门,Leaflet加载xyz地图,以vue-leaflet插件加载高德地图为例

前言 本章介绍Leaflet使用vue2-leaflet或者vue-leaflet插件方式便捷加载xyz高德地图。 # 效果演示 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到leaflet对象,方便调用leaflet的api》 vue3…...

【ARM Cache 系列文章 8 -- ARM DynamIQ 技术介绍

文章目录 DynamIQ 技术背景DynamIQ技术详解DynamIQ 与 big.LITTLEDynamIQ cluster 分类硬件支持 DynamIQ为什么适合人工智能&#xff1f; DynamIQ 技术背景 2017年3月21日下午&#xff0c;ARM在北京金隅喜来登酒店召开发布会&#xff0c;正式发布了全新的有针对人工智能及机器…...

24届近5年南京大学自动化考研院校分析

今天给大家带来的是南京大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京大学 学校简介 南京大学是一所历史悠久、声誉卓著的高等学府。其前身是创建于1902年的三江师范学堂&#xff0c;此后历经两江师范学堂、南京高等师范学校、国立东南大学、国立第四中…...

微信小程序(原生)和uniapp预览电子文件doc/pdf/ppt/excel等

微信小程序原生预览文件 function previewFile(value) {const fileExtName ${value.ext};const randFile new Date().getTime() fileExtName;uni.showLoading({title: 加载中...})wx.downloadFile({url: value.url, // 文件的本身urlfilePath: wx.env.USER_DATA_PATH / r…...

【前端 | CSS】align-items与align-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用&#xff0c;它的基本单位是每一个子项&#xff0c;在所有情况下都有效果&…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...