如何实现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…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
在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…...