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

【Redis】解析Redisson 限流器源码

Redisson

    • 一、注解AOP 代码部分提取
    • 二、设置限流器的失效时间

在这里插入图片描述
在这里插入图片描述

一、注解AOP 代码部分提取

在这里插入图片描述

// 调用Reids工具类的rateLimiter 方法long number = RedisUtils.rateLimiter(combineKey, rateType, count, time);

redis 工具类

public class RedisUtils {private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class);/*** 限流** @param key          限流key* @param rateType     限流类型* @param rate         速率* @param rateInterval 速率间隔* @return -1 表示失败*/public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) {// 获取一个限流器RRateLimiter rateLimiter = CLIENT.getRateLimiter(key);// 将限流的配置信息保存在Redis中rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS);// tryAcquire 用于获取当前可用的许可数if (rateLimiter.tryAcquire()) {return rateLimiter.availablePermits();} else {return -1L;}}
}    

解析

rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS);

源码分析
源码截图:

在这里插入图片描述

分析:trySetRate 调用 trySetRateAsync 方法

@Overridepublic boolean trySetRate(RateType type, long rate, long rateInterval, RateIntervalUnit unit) {return get(trySetRateAsync(type, rate, rateInterval, unit));}@Overridepublic RFuture<Boolean> trySetRateAsync(RateType type, long rate, long rateInterval, RateIntervalUnit unit) {return commandExecutor.evalWriteNoRetryAsync(getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,"redis.call('hsetnx', KEYS[1], 'rate', ARGV[1]);"+ "redis.call('hsetnx', KEYS[1], 'interval', ARGV[2]);"+ "return redis.call('hsetnx', KEYS[1], 'type', ARGV[3]);",Collections.singletonList(getRawName()), rate, unit.toMillis(rateInterval), type.ordinal());}

逐步分析代码:

  • commandExecutor.evalWriteNoRetryAsync():这里使用了 Redis 的 EVAL 命令,这个命令允许执行 Lua 脚本,而不会受到 Redis 的同步阻塞操作。
  • getRawName():这是获取限流器的名称或标识。
  • RedisCommands.EVAL_BOOLEAN:表示执行 Lua 脚本后期望的返回值类型为 Boolean。

源码lua 脚本解释

– 源码lua 脚本

"redis.call('hsetnx', KEYS[1], 'rate', ARGV[1]);"
+ "redis.call('hsetnx', KEYS[1], 'interval', ARGV[2]);"
+ "return redis.call('hsetnx', KEYS[1], 'type', ARGV[3]);"--- 解释
这段 Lua 脚本中,通过 redis.call('hsetnx', KEYS[1], 'rate', ARGV[1]) 等命令,尝试对 RedisHash 数据结构进行设置操作。
首先尝试设置 'rate' 字段为传入的速率值;
然后尝试设置 'interval' 字段为传入的时间间隔值;
最后尝试设置 'type' 字段为传入的类型值。这里使用了 hsetnx 命令来进行设置操作,如果字段已存在,则不会进行设置操作。
  • Collections.singletonList(getRawName()):将限流器的名称作为参数传递给 Lua 脚本。
  • rate, unit.toMillis(rateInterval), type.ordinal():这三个参数分别是速率、时间间隔以毫秒为单位、以及限流类型

总结:这段代码本身并没有提供设置限流器自动过期的功能。在 Redisson 中,限流器自动过期的功能通常不是默认包含在限流器的设置中。

二、设置限流器的失效时间

限流器自动过期(是指的是限流这个功能),可以使用expire进行失效时间设置

修改后代码:

/*** 限流** @param key          限流key* @param rateType     限流类型* @param rate         速率* @param rateInterval 速率间隔* @param expirationTimeInSeconds 过期时间(秒)* @param isExpire 是否设置限流器过期* @return -1 表示失败*/public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval, long expirationTimeInSeconds,boolean isExpire) {RRateLimiter rateLimiter = CLIENT.getRateLimiter(key);rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS);if(isExpire){// 是否设置过期时间rateLimiter.expire(expirationTimeInSeconds, TimeUnit.SECONDS);}if (rateLimiter.tryAcquire()) {return rateLimiter.availablePermits();} else {return -1L;}
}

如果代码写的有问题,欢迎大家评论交流,进行指点!!!

相关文章:

【Redis】解析Redisson 限流器源码

Redisson 一、注解AOP 代码部分提取二、设置限流器的失效时间 一、注解AOP 代码部分提取 // 调用Reids工具类的rateLimiter 方法long number RedisUtils.rateLimiter(combineKey, rateType, count, time);redis 工具类 public class RedisUtils {private static final Redis…...

docker-harbor 私有仓库部署和管理

harbor 开源的企业级的docker仓库软件。 仓库&#xff1a;私有仓库&#xff08;用的最多&#xff09; 公有仓库。 harnor是有图形化的&#xff0c;页面UI展示的一个工具。操作起来很直观。 harnor每个组件都是由容器构建的&#xff0c;所以安装harbor必须要有docker。 doc…...

机器学习笔记二-回归

回归是统计学和机器学习中的一种基本方法&#xff0c;用于建模变量之间的关系&#xff0c;特别是用一个或多个自变量&#xff08;输入变量&#xff09;来预测一个因变量&#xff08;输出变量&#xff09;的值。回归分析广泛应用于预测、趋势分析和关联研究中。根据目标和数据的…...

判断http链接中文件是否存在

最近项目遇到需要从http请求下载文件到服务器&#xff0c;下载前需要判断下http中的文件是否存在。如果判断本地服务器上文件是否存在&#xff0c;用file.exists来判断。但是这个方法却无法判断http中文件是否存在。 如果要判断http文件是否存在&#xff0c;用如下代码&#xf…...

Flink CDC (session模式)

1、 # Start YARN session ./bin/yarn-session.sh --detached 2、配置文件&#xff1a; rest.bind-port: {{REST_PORT}} rest.address: {{NODE_IP}} execution.target: yarn-session yarn.application.id: {{YARN_APPLICATION_ID}} 3、mysql-doris.yml source:type: mysql…...

下载ISO镜像的方法 Debian、Red Hat 、CentOS、Ubuntu、Kali Linux

目录 Debian Red Hat CentOS Ubuntu Kali Linux Debian 下载步骤&#xff1a; 访问Debian的官方网站&#xff1a;Debian官网。在网站上找到“Downloads”或类似的下载链接。选择适合你的计算机架构&#xff08;如amd64、i386等&#xff09;的Debian版本。点击下载ISO镜像…...

想学接口测试,不知道那个工具适合?

接口测试是软件测试中的一项重要任务&#xff0c;它主要关注系统的不同组件之间的数据交换和通信。接口测试是一种黑盒测试方法&#xff0c;它可以帮助我们验证系统的功能和性能是否达到预期&#xff0c;并且确保不同组件之间的消息传递是正确的。在接口测试过程中&#xff0c;…...

干货分享 | TSMaster—RP1210模块使用指南

RP1210是由技术和维护委员会&#xff08;TMC&#xff09;编写的一种建议性实践。RP1210用于对重型车辆射频相关的&#xff08;主要针对&#xff09;电子控制单元&#xff08;ECU&#xff09;进行二次编程和分析。本文主要针对TSMaster—RP1210模块的操作进行详细介绍。 本文关…...

一步解决Ubuntu中无法使用git clone的问题

在网上找了很多教程都无法解决&#xff0c;最后用了一行命令成功解决 git config --global url."https://github.com".insteadOf git://github.com输入这行命令&#xff0c;之后就可以使用git clone了...

c++的时间复杂度

前言 Hello,大家好我是文宇. 最近没怎么写文章了,写个教程吧. 正文 C是一种高级编程语言&#xff0c;用于开发各种类型的应用程序&#xff0c;包括计算机科学中的算法和数据结构。在编写代码时&#xff0c;了解算法和数据结构的时间复杂度非常重要&#xff0c;因为它可以帮…...

PDF转图片 JAVA

前言 以下是一个使用 Apache PDFBox 将 PDF 文件转换为图片的封装方法。这个方法将会把 PDF 的每一页转换为一张图片&#xff0c;并保存到指定的目录中。 1.添加依赖 首先&#xff0c;你需要在项目中添加 PDFBox 的依赖。如果你使用的是 Maven&#xff0c;可以在 pom.xml 中添…...

树莓派5 笔记26:ollama大型语言模型_中文输入法_Python_espeak文字转语音

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 下载大语言模型&#xff0c;下载中文输入法&#…...

【kubernetes】k8s安全机制

Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 API Server…...

Android T(13) The app is granted permissions by default

我的博客 对比Android11,frameworks\base\services\core\java\com\android\server\pm\permission文件夹下,多了个PermissionManagerServiceImpl.java. 有一部分关于权限的处理,移到了这个文件中.比如:restorePermissionState(…) all app granted permissions by default b/fr…...

4 - Linux远程访问及控制

目录 一、SSH远程管理 1. SSH概述 2.SSH的优点 3.配置OpenSSH客户端 4.sshd服务支持的两种验证方式 5. 使用SSH客户端程序 5.1 ssh - 远程登录 5.2 scp - 远程复制 6.配置密钥对验证 二、TCP Wrappers访问控制 1.TCP Wrappers 概述 2. TCP Wrappers 机制的基本原则 …...

如何使用AWS EC2资源?

随着云计算技术的迅速发展&#xff0c;越来越多的企业和个人选择将工作负载迁移到云端&#xff0c;以获取灵活性、可扩展性和成本效益。作为全球领先的云计算服务提供商&#xff0c;AWS为用户提供了丰富的服务&#xff0c;其中最受欢迎的之一是云服务器EC2。本文中九河云将探讨…...

Linux高编-进程的概念(1)

目录 1.ps aux 2.top 3.kill -2 进程pid // fork函数 getpid拿自己的进程号 getppid拿父进程号 fork&#xff08;&#xff09;&&fork&#xff08;&#xff09;||fork&#xff08;&#xff09; 父子进程的关系&#xff1a; 僵尸进程&#xff0c;孤儿进程 僵…...

go语言中new和make的区别

在 Go 语言中&#xff0c;new 函数不能用来创建通道&#xff08;chan&#xff09;&#xff0c;这是因为 new 只分配内存并返回指向该内存的指针&#xff0c;而不负责初始化内存。 为什么不能使用 new 来创建通道&#xff1f; new 只能分配内存&#xff0c;但不会对内存进行初…...

SpringBoot响应式编程(3)R2DBC

一、概述 1.1简介 R2DBC基于Reactive Streams反应流规范&#xff0c;它是一个开放的规范&#xff0c;为驱动程序供应商和使用方提供接口&#xff08;r2dbc-spi&#xff09;&#xff0c;与JDBC的阻塞特性不同&#xff0c;它提供了完全反应式的非阻塞API与关系型数据库交互。 …...

什么是私有继承

私有&#xff0c;公有&#xff0c;针对类而言&#xff1b; 私有( private )的成员&#xff0c;自己的&#xff0c;只能在自己内部( 类的定义体内部 )访问&#xff0c;外部( 类的定义体外部 )不能访问/调用&#xff1b; 公有( 或者说公开&#xff0c;public )的成员&#xff0…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...