如何实现Redisson分布式锁
首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。
Redisson:其实就是相当于在redis的基础上进行了加强,让redisson不像redis的分布式是直接基于指令setnx(set if not exists: 如果不存在)去实现的。
开始配置
因为redission是基于redis的,所以我们需要本地安装reids,redis安装这里就不演示了,这里是使用springboot创建的项目,我们默认项目已经创建完成了,所以直接开始配置
项目结构
1、配置redis
#以下是application.yml中的配置
server:port: 8083spring:redis:host: localhostport: 6379timeout: 1000jedis:pool:min-idle: 5max-idle: 10max-wait: -1
2、配置pom.xml 引入相关jar包
<!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 引入redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.7</version></dependency>
3、编写测试并发类
package cn.sendmsg.test;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class redissonController {@RequestMapping("/testLock")public void testRedissLock(){// 使用Redisson 设置分布式锁//1、配置Redisson客户端 Config对象用于配置 Redisson 客户端的参数。Config config = new Config();//2、连接地址 连接方式redis:// 或者 rediss://// 集群使用// config.useClusterServers()// .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒// //可以用"rediss://"来启用SSL连接// .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")// .addNodeAddress("redis://127.0.0.1:7002");/** userSingleServer():指定使用单个redis服务配置* setAddress() : 设置 Redis 服务器的地址* setPassWord(): 设置连接 Redis 服务器的密码,如果有的话* setDatabase(0): 设置连接的数据库索引,0就表示第一个* */config.useSingleServer().setAddress("redis://localhost:6379");//3、 创建Redisson客户端RedissonClient redissonClient = Redisson.create(config);String lockValue = "isLock";// 获取红锁RLock redissonLock = redissonClient.getLock(lockValue);try {// 后去锁,如果获取到返回true// tryLock():尝试3秒内获取锁,如果获取到了,最长3秒自动释放boolean lock = redissonLock.tryLock(3L,3L, TimeUnit.SECONDS);// 获取锁后,开始执行需要加锁的逻辑代码if(lock){System.out.println("获取到锁了");for(int i =0;i<5;i++){log.info("执行逻辑,查看打印结果:{}",i);}}} catch (InterruptedException e) {log.info("获取锁失败,失败原因:{}",e.getMessage());throw new RuntimeException(e);}finally {// 最后一定要释放锁,不然有可能造成死锁现象redissonLock.unlock();}}// 用于jmater测试不加锁的信息,对比看@RequestMapping("/testNoLock")public void testRedissNoLock(){for(int i =0;i< 10;i++){log.info("无分布式锁的逻辑:"+i);}}}
4、使用jmater测试(这是个压测工具,可以一次性发多个线程,来进行压力测试),这个自行安装以下
以下是jmater工具页面截图,这个花3分钟时间,自己学习下,主要还是设置yml、pom.xml、测试类,这个属于工具
5、查看本地代码运行结果(注意看打印结果,因为获得了分布式锁,所以在执行代码块for循环时,是顺序的,不然不是顺序的)
获取到锁了
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
到这里,其实我们就已经实现Redisson分布式锁了,不要把这个想的太复杂,可能在集群时需要注意些。 示例代码中演示了集群时如何设置。这是一个简单的案例,但实际开发者,获取锁-释放锁也是这么用的。加油
6、不加锁使用jmater打印的信息
不加锁,for循环打印时,输出日志就不是有顺序的
15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.081 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.078 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.210 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.211 INFO 40508 --- [io-8083-exec-26] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
相关文章:

如何实现Redisson分布式锁
首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…...

Kafka(三)生产者发送消息
文章目录 生产者发送思路自定义序列化类配置生产者参数提升吞吐量 发送消息关闭生产者结语示例源码仓库 生产者发送思路 如何确保消息格式正确的前提下最终一定能发送到Kafka? 这里的实现思路是 ack使用默认的all开启重试在一定时间内重试不成功,则入库ÿ…...

2020年五一杯数学建模C题饲料混合加工问题解题全过程文档及程序
2020年五一杯数学建模 C题 饲料混合加工问题 原题再现 饲料加工厂需要加工一批动物能量饲料。饲料加工需要原料,如加工猪饲料需要玉米、荞麦、稻谷等。加工厂从不同的产区收购了原料,原料在收购的过程中由于运输、保鲜以及产品本身属性等原因ÿ…...

公益SRC实战|SQL注入漏洞攻略
目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站(可以查找sql注入漏洞) inurl:asp idxx 2.查找网站后台(多数有登陆框,可以查找弱口令,暴力破解等漏洞&…...

Word软件手动安装Zotero插件
文章目录 Word软件手动安装Zotero插件方法一方法二 参考资料 Word软件手动安装Zotero插件 方法一 关闭word在zotero中依次点击编辑—首选项—引用—文字编辑软件—重新安装加载项Microsoft word 方法二 寻找Zotero.dotm存储位置, 例如D:\Program Files\Zotero\ext…...

idea 插件推荐第二期
文章目录 便捷开发CodeGlance Pro (代码缩略图)GenerateAllSetter(快速生成对象所有set方法)GsonFormatPlus:json转实体RestfulToolkitX(找到controller快捷请求接口) 美化activate-power-mode-x (敲击计数、动效)Nyan…...

plsql查询中文出现乱码
添加环境变量:如下 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 变量名:TNS_ADMIN 变量值:D:\instantclient_11_2\network\admin 在Path中添加instantclient_11_2存放路径...

【Docker】五分钟完成Docker部署Java应用,你也可以的!!!
文章目录 前言一、部署步骤1.项目结构2.Dockerfile3.docker-compose.yml4.启动5.常用命令 总结 前言 本文基于Docker Compose部署Java应用,请确保你已经安装了Docker和Docker Compose。 十分钟就能上手docker?要不你也试试? 一、部署步骤 1…...

如何准备2024年的系统设计面试?
1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…...

【开源】基于JAVA的电子元器件管理系统
目录 一、摘要1.1 项目简介1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 …...

足底筋膜炎怎么治疗治愈
足底筋膜炎又称为跖筋膜炎,跖筋膜主要在足弓下方,它维持足弓稳定性,对于喜欢长期长跑、跳远,或者越野运动,或者部队中的士兵进行拉练,还有需要久坐或者久站的人群中,容易发生跖筋膜炎。治疗方法…...
Keil工程忽略文件.gitignore、自动删除脚本:keilkilll.bat、自动生成目录文件列表脚本
Keil工程忽略文件:.gitignore 忽略规则 *.rar *.o *.d *.crf *.htm *.dep *.map *.bak *.lnp *.lst *.ini *.iex *.sct *.scvd *.dbg* *.uvguix.* *Log.*#忽略.gitignore根目录下的文件夹,根据自己的需要修改 RTE/ Templates/ Examples/ OBJ/#不能忽略…...
软考高级职称哪个好考?明确给你答案
软考考试分为初、中、高三级,其中高级5个方向分别为系统分析师、信息系统项目管理师、网络规划设计师、系统架构设计师、系统规划与管理师。软考高级职称考什么好?有很多人是因为要评高级职称而选择参考软考高级资格考试,那么软考高级里哪个资…...
智能客服外包服务适用于哪些行业?
在当今快节奏的商业环境下,企业需要更高效、更智能且更灵活的客户服务解决方案。而智能客服外包服务正是满足这一需求的利器。不仅可以帮助企业提升客户服务的品质和效率,还能降低企业的运营成本。智能客服外包服务适用于哪些行业呢? 1.电子…...
数字化企业各业务模块模型
1.计划 1.1采购计划执行情况 序号 采购计划号 采购订单号 业务员 供应商 物料 数量 金额 计划入库日期 实际入库日期 状态 针对企业执行中或者未关闭的采购计划进行统计与分析,主要目的在于引领企业员工与领导关注长期在途的采购…...
WPF动画小知识
一、动画合集 创建一个Storyboard演示画板,在画板里对动画进行定义与处理。 常见动画类型 提醒:更多介绍可查看microsoft提供的相关文档 DoubleAnimation //普通Double型控制动画 DoubleAnimationUsingKeyFrames //Dou…...

数据结构 顺序表和链表
1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串.. 线性表在逻辑上是线性结构,也就说是连续的一条直线…...

LMI相机配置步骤,使用Gocator2550相机
在此之前可以先浏览我编写的相机SDK通用类和LMISDK,进行配套观看 https://blog.csdn.net/m0_51559565/article/details/134404394 //LMI相机SDK https://blog.csdn.net/m0_51559565/article/details/134403745 //相机通用类1.启动LMI加速器 LMI加速器用于将相机…...

掌握Python中的控制流语句:break, continue, quit的应用技巧详解
引言 在Python编程中,控制流语句是非常重要的一部分,它们可以帮助我们控制程序的执行流程。其中,break、continue和quit是常用的控制流语句,它们可以在循环中起到关键作用。本文将详细介绍这些控制流语句的应用技巧,帮…...

TS手动编译和自动编译方法
把 TS 文件编译成 JS 文件 安装 npm i -g typescript检查是否安装成功 tsc -v方法一 先通过 tsc 把 .ts 文件编译成 .js 文件,再通过 node 把 .js 文件运行 方法二 通过监视配置页面 初始化 tsc --init自动生成一个tsconfig.json 文件 点击进入tsconfig.js…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...