基于 Redis 的分布式信号量 Spring Boot 集成 Redisson 使用 Semaphore 控制并发访问数量

目录

前言

pom

yml

Controller

演示

注意


前言

工作中开发过一个服务,这里记作A服务,主要功能是配置,部署以及调用云函数。其中配置云函数的功能里,有一个配置项是并发数,意思是同一时间最多能有多少个请求调用已部署的云函数。

客户端通过调用A服务,再由A服务去调用云函数,从而实现客户端请求云函数的功能。在调用云函数时,是要根据配置的并发数控制请求的数量。如果时单机架构的话,直接使用JDK中的 Semaphore 就能够实现并发线程控制了。但是项目的架构是微服务架构,所以需要使用分布式信号量才行。

项目中有使用 Redis,所以可以基于 Redis 来实现分布式信号量,使用 Spring Boot 集成 Redisson 使用 RSemaphore 就能够轻松实现分布式信号量了。

pom

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

yml

application.yml

spring:redis:redisson:config: "classpath:redisson.yml"server:port: 8888

redisson.yml

{"singleServerConfig":{"idleConnectionTimeout":10000,"pingTimeout":1000,"connectTimeout":10000,"timeout":3000,"retryAttempts":3,"retryInterval":1500,"subscriptionsPerConnection":5,"clientName":null,"address": "redis://localhost:6379","subscriptionConnectionMinimumIdleSize":1,"subscriptionConnectionPoolSize":50,"connectionMinimumIdleSize":32,"connectionPoolSize":64,"database":0},"threads":0,"nettyThreads":0,"codec":{"class":"org.redisson.codec.JsonJacksonCodec"},"transportMode":"NIO"
}

Controller

以下示例代码演示如何使用 Redisson 中的 RSemaphore

初始化了一个 semaphore 的信号量,并设置其 permits 为 1,即最多一个线程能获取许可

接口 /redisson/semaphore 逻辑中,首先会尝试获取许可,拿到许可后才能往下执行业务逻辑,若是超过1秒还没获取到许可,则说明当前存在线程正在处理,就直接返回提示信息”服务器繁忙,请稍后再试“

@RestController
@RequestMapping("/redisson")
public class RedissonController implements InitializingBean {@Resourceprivate RedissonClient client;private RSemaphore semaphore;@Overridepublic void afterPropertiesSet() {semaphore = client.getSemaphore("semaphore");semaphore.trySetPermits(1);}/*** semaphore*/@GetMapping("/semaphore")public String semaphore() throws InterruptedException {if (!semaphore.tryAcquire(1, TimeUnit.SECONDS)) {return "服务器繁忙,请稍后再试";}try {//处理业务逻辑System.out.println("processing");Thread.sleep(1000 * 4);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {semaphore.release();}return "成功";}
}

演示

启动后,使用 Navicat 连接上 redis 查看,可以看到上面已经设置了一个名为 semaphore, 类型为 string 的 key,其值为 1

Redisson客户端获取许可的底层是通过lua来实现的,如果能够成功获取返回true,否则返回false。调用 acquire 方法时,首先获取到剩余的许可数量,当只有剩余的许可数量大于想要获取的许可数量时返回1否则返回0。

上面的演示代码将分布式信号量的值设置为 1,所以同一时间最多只能有一个线程执行业务逻辑。

同时发送两个请求,就会返回“服务器繁忙,请稍后再试”

结果如下

注意

通过 Redisson 的 Rsemaphore,就能够轻松地实现分布式信号量,从而在分布式系统中控制并发请求数量了。不过使用 Redisson 地 Rsemaphore 时,也需要注意以下的问题

acquire 和 release 方法必须成对使用

也就是说成功调用了acquire获取到了许可,就必须保证执行完业务逻辑后,调用release释放许可。这样才能保证分布式信号不会越用越少,以至于到最后分布式信号量变成0,所有的请求都执行不了。

同理,也要保证程序中多次release,调用一次acquire获取许可,之后却多次调用release释放许可,会导致分布式信号量的值越来越大,从而无法实现并发控制访问请求的功能。

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

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

相关文章

【MATLAB源码】数学建模基础教程(2)--层次分析法(评价类算法)

系列文章目录在最后面&#xff0c;各位同仁感兴趣可以看看&#xff01; 层次分析法 引言一、层次分析法的特点二、模型的建立求解过程 (1)问题的提出&#xff1a;实际问题的转化(2)建立层次结构模型(3)构造判断(成对比较)矩阵(4)一致性检验&#xff1a;三、层次分析法的优点与…

Codeforces Round 871 (Div. 4)(A~H)

比赛链接 Dashboard - Codeforces Round 871 (Div. 4) - Codeforces A. Love Story 找到与codeforces 有多少个不同的字符。 #include<bits/stdc.h> #define int long long #define TEST int T; cin >> T; while (T--) #define ios ios::sync_with_stdio(fals…

前端常用的性能优化方案

目录 性能分析工具lighthouseWebpack Bundle分析 开发阶段按需引入路由懒加载 打包阶段打包配置减少包体积配置压缩分包 资源预加载/预请求 部署阶段开启http2静态资源缓存gzip压缩 性能优化主要在三个阶段进行&#xff1a;开发阶段、开发结束后的打包阶段、项目部署上线阶段 首…

提升生产效率:APS高级计划排程系统在车间工序级排程的革命性应用

在制造业的数字化转型浪潮中&#xff0c;APS高级计划排程系统以凭借自身卓越的排程运算能力和应用灵活性&#xff0c;已经成为中大型制造业提升生产效率的关键工具。APS系统的介入&#xff0c;打通了传统ERP和MES等各类业务系统运营平台&#xff0c;并且通过产能均衡规划&#…

为什么我3d模型选择面选不到?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师常常面临诸多技术挑战&#xff0c;其中之一是在模型编辑过程中遇到选择面的困难。这不仅影响了设计工作效率&#xff0c;还可能影响最终作品的质量和展示效果。本文将探讨在3D模型设计中为何会遇到“为什么我3D模型选择面选不到?”这…

【MySQL进阶篇】管理

1、系统数据库 MySQL数据库安装完成之后&#xff0c;自带以下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息&#xff08;时区、主从、用户、权限等&#xff09;information_schema提供了访问数据库元数据的各种表…

实战OpenCV之环境安装与配置

OpenCV是什么 OpenCV&#xff0c;英文全称为Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法&#xff0c;以帮助开发者处理图像和视频数据&#xff0c;实现各种视觉任务&#xff0c;包括&#xf…

.NET内网实战:模拟Installer关闭Defender

01基本介绍 02编码实现 原理上通过Windows API函数将当前进程的权限提升至TrustedInstaller&#xff0c;从而实现了对Windows Defender服务的控制。通常可以利用Windows API中的OpenSCManager、OpenProcessToken、ImpersonateLoggedOnUser以及ControlService等函数协同工作&am…

从干涉实验、化学反应到晶体管的科学之旅 - 《量子宇宙》读后感

在《量子宇宙》这本书中&#xff0c;作者没有讲述历史和发现的故事&#xff0c;而是从头到尾用公式推导来展示宇宙和现代物理学的壮美。 量子理论处理的是概率&#xff0c;而不是确定性。大自然在某些方面本质上就是由或然率支配的。计算粒子出现的概率是我们能做到的极限。 …

渗透小游戏,各个关卡的渗透实例---步骤简单(含代码)

文章目录 Less-1Less-2Less-5updatexml报错注入&#xff1a; Less-6Less-7Less-8Less-9Less-11Less-13Less-15 Less-1 首先&#xff0c;可以看见该界面&#xff0c;该关卡主要是SQL注入&#xff0c;由于对用户的输入没有做过滤&#xff0c;使查询语句进入到了数据库中&#xff…

springboot电影院线上购票系统-计算机毕业设计源码68220

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 添加信息流程 2.2.2 修改信息流程 2.2.3 删除信息流程 2.3 系统功能分析 2.…

synchronized 与 Lock 的区别

synchronized 与 Lock 的区别 1、相同点2、不同点2.1 精确性与灵活性2.2 性能2.3 使用便利性 3、示例3.1 synchronized 示例3.2 Lock 示例 4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java多线程编程中&#xff0c;synchroniz…

智能家居沙盘系统-智慧家居沙盘系统

智能家居和物联网技术是当前科技领域的热门话题&#xff0c;随着各类智能家居产品的不断推出&#xff0c;智能家居市场也逐渐呈现出蓬勃发展的态势。智能家居快速发展&#xff0c;而物联网相关人才供应远远不足。高校开展智能家居工程及设计人才教育培养具有重大意义。 基本介绍…

【stm32】EXTI外部中断

EXTI外部中断 1、中断系统2、中断执行流程3、STM32中断4、NVIC基本结构5、NVIC优先级分组6、EXTI简介&#xff08;引脚电平变化&#xff0c;申请中断&#xff09;7、EXTI基本结构8、AFIO复用IO口9、EXTI框图10、旋转编码器简介11、程序设计&#xff1a;1.使用对射式红外传感器触…

vue3实现商品图片放大镜效果(芋道源码yudao-cloud 二开笔记)

今天开发一个防某商城的商品图片放大镜&#xff0c;鼠标移动到图片位置时&#xff0c;右侧出现一个已放大的图片效果。 示例如下&#xff1a; 下图的图片的放大效果和小图的切换封装成了组件PicShow.vue&#xff0c;可根据需求自行修改&#xff0c;如下&#xff1a; 第一步&…

Html5总结

前端学习 html决定页面的结构css决定页面的样式js决定页面的行为 Html5 1.文本格式化标签&#xff08;熟记&#xff09; 你在网页中&#xff0c;有时需要为文字设置粗体、斜体或下划线效果&#xff0c;这时就需要用到HTML中的文本格式化标记 2.标签属性 例如&#xff1a; …

算法 —— 位运算

目录 位运算常用结论 位运算例题 位1的个数 比特位计算 汉明距离 只出现一次的数字 判定字符是否唯一 丢失的数字 两整数之和 消失的两个数字 进制转换 位运算常用结论 想详细了解位运算的内容可以阅读我的这篇博客&#xff1a;应该背下的位运算 以下我只介绍一些位…

3.特征工程-特征抽取、特征预处理、特征降维

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.数据集: sklearn代码运行结果 2.字典特征抽取: DictVectorizer代码运行结果稀疏矩阵 3.文本特征抽取(英文文本): CountVectorizer()代码运行结果 4.中文文本分词(中文文本特征抽取使用)代码运行结果 5.中文文本特征抽…

Linux基础笔记分享(超详细~)

文章目录 Linux基础1.基础概念2.基础命令命令行快捷键自动补全: tab移动光标快速删除翻看历史命令终止程序退出登录清屏 查看命令帮助alias命令别名-快捷键pwd-类似于地图cd-类似于传送术mkdir-类似于合成装备touch-创建文件ls-类似于查看装备tree-打印目录层级结构cp-复制命令…

HarmonyOS 习题(一)

1、在HarmonyOS系统架构中&#xff0c;以下哪项属于应用层? A&#xff09;AI子系统 B&#xff09;U框架 C&#xff09;电话 D&#xff09;内核 答案&#xff1a;C 解析&#xff1a; 2、在HarmonyOS系统架构中&#xff0c;以下哪项提供统一的外设访问能力和驱动的开发管理框架…