博客系统案例练习2-用户注册-redis
前言
用户注册
[请求]/user/register[参数]contentType: application/json{"userName":"wangwu","password":"456789","githubUrl": "https://gitee.com/bubble-fish666/spring-cloud","email": "bite666@126.com"}[响应]{"code": 200,"errMsg": null,"data": 3 //⽤⼾ID
}
⽤⼾注册增加邮箱字段(数据设计阶段,提供的SQL已包含该部分内容)
我们先定义返回的类,然后是非空定义,长度校验
然后是定义接口,实现接口
那个类的转换部分非常的繁琐,我们可以优化一下
直接抽出来
这样直接调用就可以了
还要改的一个地方就是密码,要加密存储
这样写就可以了,因为我们有全局异常处理类的
邮箱校验和测试
用正则表达式
我们把正则表达式的校验都放在blog-comon里面的工具包里面
public class RegexUtil {/*** 匹配 邮箱:xxx@xx.xxx(形如:abc@qq.com)* ^ 表示匹配字符串的开始。* [a-z0-9]+ 表示匹配一个或多个小写字母或数字。* ([._\\-]*[a-z0-9])* 表示匹配零次或多次下述模式:一个点、下划线、反斜杠或短横线,后面跟着一个或多个小写字母或数字。这部分是可选的,并且可以重复出现。* @ 字符字面量,表示电子邮件地址中必须包含的"@"符号。* ([a-z0-9]+[-a-z0-9]*[a-z0-9]+.) 表示匹配一个或多个小写字母或数字,后面可以跟着零个或多个短横线或小写字母和数字,然后是一个小写字母或数字,最后是一个点。这是匹配域名的一部分。* {1,63} 表示前面的模式重复1到63次,这是对顶级域名长度的限制。* [a-z0-9]+ 表示匹配一个或多个小写字母或数字,这是顶级域名的开始部分。* $ 表示匹配字符串的结束。*/private static final String emailRegex = "^[a-z0-9]+([._\\\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$";/*** 进行简单校验, 为URL即可* https://gitee.com/bubble-fish666/* ^:匹配字符串的开始。* (https?):匹配http或https。* :\/\/:匹配://。* ([a-zA-Z0-9.-]+):匹配域名,可以包含字母、数字、点和破折号。* (:\d+)?:可选部分,匹配冒号和端口号。* (\/[^\s]*)?:可选部分,匹配斜杠和路径,路径中不包含空白字符。* (\?[^\s]*)?:可选部分,匹配查询参数,参数中不包含空白字符。* $:匹配字符串的结束。*/private static final String urlRegex = "^(https?):\\/\\/([a-zA-Z0-9.-]+)(:\\d+)?(\\/[^\\s]*)?(\\?[^\\s]*)?$";/*** 邮箱:xxx@xx.xxx(形如:abc@qq.com)** @param content* @return*/public static boolean checkMail(String content) {if (!StringUtils.hasText(content)) {return false;}return Pattern.matches(emailRegex, content);}public static boolean checkURL(String content) {if (!StringUtils.hasText(content)) {return false;}return Pattern.matches(urlRegex, content);}public static void main(String[] args) {System.out.println(checkMail("bite@126.com"));}
}
?表示前面元素0-1次
*表示前面元素0-n次
+表示前面元素1-n次
直接复制就可以这个代码就可以了
然后就是使用了
这样就OK了
可以测试了
我们这里对NotBlank这种注解抛出的异常,统一的处理都是参数校验失败,统一被MethodArgumentNotValidException捕获,如何打印出具体的内容呢
这个是可以实现的
这样就可以了
length的话,就不校验了
我们不为空就校验好了
然后开始校验用户名不能重复
url可以为空
这个也校验好了
这个的异常是blogExcetion,状态码是200,刚刚的参数校验不为空的状态码是400
这个都是可以自己设置的
这里改一下写错了,然后是校验email和url
这样就成功了
注意我们这里没有setId,但是却可以获得id,这个的原因主要就是
我们在这里设置了注解,这个注解就可以在插入成功以后自动填充这个类里面的主键,自动返回主键,type是为了让主键不要太乱
Redis介绍
介绍
在对于性能要求⽐较⾼的模块中,Redis作为⼀个缓存层,经常存储⼀些热点数据,减少数据库的读取压
⼒,提⾼数据访问速度
Redis 是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的
值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、
Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis
可以满⾜很多的应⽤场景.因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。不
仅如此,Redis还可以将内存的数据利⽤快照和⽇志的形式保存到硬盘上,这样在发⽣类似断电或者机
器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、
事务、流⽔线、Lua脚本等附加功能。总之,如果在合适的场景使⽤号Redis,它就会像⼀把瑞⼠军⼑
⼀样所向披靡。
2. Redis 的使⽤场景
2.1 缓存(Cache)
缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能
够有效地降低后端数据源的压⼒。Redis提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和
内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。
2.2 排⾏榜系统
排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照
各种复杂维度计算出的排⾏榜,Redis提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很
⽅便地构建各种排⾏榜系统。
2.3 计数器应⽤
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的
实时性,每⼀次播放和浏览都要做加1的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑
战。Redis天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。
2.4 社交⽹络
赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量
通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对⽐
较容易地实现这些功能。
2.5 消息队列系统
消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等
特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列⽐还不够⾜够强⼤,但是
对于⼀般的消息队列功能基本可以满⾜
redis命令操作
安装
#使⽤apt安装Redis
apt install redis -y
命令
#查看Redis状态
systemctl status redis-server
#再按ctrl+c结束显示#启动redisservice redis-server start#停⽌redis服务
service redis-server stop#重启redis服务
service redis-server restart
# 使⽤以下命令启动redis客⼾端
redis-cli
6379就是redis的默认端口号
常⻅命令介绍:
SET key value
GET key
DEL key [key…]
EXISTS key [key…]
EXPIRE key seconds
KEYS pattern
set test aaa
get test
set test bbb
get test
重新设置就是更新值
del test
这个就是删除值
exists test
这个就是判断test是否存在
set test2 ddd ex 20
这个表示有效时间为20s,ex是s的意思
ttl test2
表示这个key的有效时间为多少
变成-2表示就过期了
没有设置过期时间的话,就是永不过期,ttl=-1
set test3 eee
ttl test3
expire test3 30
ttl test3
expire 也是设置过期时间为30s
keys *
就是返回redis里面所有的key,一般不要用
官网
想了解什么命令,直接搜就可以了
springboot集成redis
在user-service中引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后是配置yml
spring:data:redis:host: 139.159.230.105port: 6379timeout: 60s #连接空闲超过N(s秒、ms毫秒)后关闭,0为禁用,这里配置值和tcp-keepalive值一致lettuce:pool:max-active: 8 #允许最大连接数max-idle: 8 #最大空闲连接数, 默认8min-idle: 0 #最小空闲连接数max-wait: 5s #请求获取连接等待时间
test测试
我们对这个直接运行
然后就报错了
根本就没有链接上
因为端口号6379没有开放,或者是redis没有启动
我们不建议开放这个端口号
我们可以通过隧道的方式来链接
xshell中
点这个
点击属性
然后是隧道-》添加
这个监听端口是没有使用的端口号
就是监听一个端口号,映射到我们的6379端口号,这样就不用开放了
就是这个意思
配置隧道之后,要重新连接云服务器
这个的意思就是我访问本地的6379就是转移到云服务器上的6379
所以我们把配置改成本地的6379
重新运行
这样就成功了
redis客户端
我们不使用小黑框框了,我们用好看的应用软件来远程控制redis
官网下载
然后点这个
我们这个建立连接的方式是通过隧道的方式,所以写的是127.0.0.1
这样就是链接成功了
这个是redis控制台,可以输入命令
插件操控redis
在File->Settings->Plugins->搜索Redis Helper插件
这里就多了一个控制的
然后加号,添加链接
右键加载
redis默认有16个DB,默认会在DB0里面放数据
这里也可以选择DB
右键这个控制台
可以输入代码
然后是双击DB也可以得到数据
Redis工具类分装
就是用户登录的时候,要从数据库中获取信息,现在从redis中获取
在⽤⼾登录后,可以将⽤⼾的信息存储在Redis中,当需要获取⽤⼾信息时,可以直接从Redis中获取,⽽不需要每次都查询数据库,这样可以加快数据的读取速度,减少数据库的压⼒.
查询用户就看redis里面有没有,没有的话,就去数据库查
更新用户的时候,就更新数据库和redis
删除用户就是删除数据库和删除redis
数据库和redis要一致性,分布式事务–》以后再说
我们直接写一个工具包
先在blog-common里面引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
但是这个StringRedisTemplate必须要Autowired注入才可以使用,这个已经是bean了的
但是使用Autowired,又必须把Redis这个类注入bean中,所以就要加上Configuration,但是另外的user-service扫描不到啊,这个也不是那个feign
我们可以在user-service中传入我们已经Autowired好的StringRedisTemplate,这样就可以在blog-common里面使用StringRedisTemplate了,而且都是spring中的同一个StringRedisTemplate
这样就可以了,然后就可以分装工具了
这个工具包以后直接复制就可以了
注意我们的set方法可以自带过期时间的,这个是原码
默认是s,其次是毫秒
这样我们的工具类就写好了
然后开始使用
我们可以把Redis这个类交给spring进行管理,注入外部类的方法
就是在user-serivce里面注入外部类,而不是在外部类里面声明为bean,注入bean
在user-serivce里面注入外部类,把外部类注入为bean,就要使用Configuration,和bean注解了
这样我们就把redis搞入bean了,这个参数StringRedisTemplate 是自动Autowired的了,所以我们不用再单独写注解Autowired去注入StringRedisTemplate 了,而且还是已经自动bean了的,自动注入的了,这个是自动注入bean的,我们弄为·参数,就是自动Autowired
测试一下发生了异常
我们打印一下异常的日志
在测试一下,发现错误就是不能连接上redis
原因就是隧道关闭了,隔一段时间就会关闭的,这个隧道
直接连上云服务器就可以了,开启客户端就可以看有没有连上了
或者左边有一个小圆圈圈的话,就是开启了隧道的
这样就成功了
spring自动装配redis
如果我们的blog-serice要想使用redis的话
也要加上这个代码
可以写在blog-comomn里面吗
我们挪到这里,把原来user-service里面的这个config删掉
但是这样不能运行的
因为autowired的时候找不到redis这个bean
因为spring装配扫描的时候,只会扫描启动类所在目录下的,如果想要扫描其他地方的,要加上注解了
加上注解ComponentScan
或者Import
我们讲一个新的方法
我们希望把Redis自动弄为bean,我们就不管了
先搞个文件夹
双击shift
搜索这个AutoConfigurationImportSelector
找到这个,然后创建对应文件
这个里面配置我们希望交给spring管理的对象
这样就可以交给spring管理了
这个的意思就是和StringRedisTemplate 一样的了
只要你在一个包user-servicec里面引入了blog-common的依赖,那么就会去扫描Redisconfig,然后把里面的Redis这个类自动加入bean
所以再也不用在自己配置手动把外面的Redis加入自己的bean了,只有你引入依赖,就会自动装入bean
这样就可以了
所以有很多的方法,在自己模块的spring里面把别人的类,加入成自己的bean
第一就是注解Configuration和注解Bean,当然这个也可以把自己的类注入为自己的bean
但是把自己的类注入为自己的bean,还可以注解service和controller那些,很多的
第二就是启动类那里加上注解加上注解ComponentScan或者Import
第三就是在外部的地方,按照这个AutoConfigurationImportSelector的处理方法,使引入外部依赖的时候,就自动把外部配置好的类,自动注入bean
文件路径是META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
但是第三个方法的缺点就是,我引入了blog-common的依赖,不管我们需不需要Redis这个类,都会注入为bean
我们的要求是要使用redis,注入进来,不使用的话,就不要注入进来,虽然我们引入了blog-common的依赖
怎么弄呢
@Conditional讲解
@Conditional
是Spring框架从4.0版本开始引⼊的⼀个注解,它允许开发者根据特定的条件来控制Bean的注册.⼀般与@Configuration 和@Bean 配合使⽤。简单说,Spring在解析@Configuration 配置类的时候,如果该配置类增加了@Conditional 注解,那么会根据该注解配置的条件来决定是否要实现Bean的装配.
注解Conditional就是满足一定条件的时候才会注入这个bean
我们直接用一个测试方法来理解这个注解
因为加上了SpringBootTest注解,所以这个测试类也是可以交给spring进行管理的
这样的话,JDK17和JDK21也注入到spring里面了
而且因为一定会注入bean,所以肯定也会打印信息,运行的时候
但是我们现在希望只要使用了才注入对应的bean
就要用Conditional了
记得选择这个
这样我们就写了JDk的两个判断条件
如果Jdk17Conditional.class 返回true,则创建JDK17对象,则注入bean
这样就可以了
我们看到运行结果只有17了
但是类似于这个的conditional的注解还有很多
@ConditionalOnBean
当容器中存在指定的Bean时,使⽤这个注解的配置类或Bean⽅法才会⽣效
@ConditionalOnMissingBean
与@ConditionalOnBean 相反,只有当容器中不存在指定的Bean时,才会注册使⽤这个注解的Bean如果 DependencyBean 不存在, MyBean 会被注册。
@ConditionalOnClass
当类路径上存在指定的类时,使⽤这个注解的配置类或Bean⽅法才会⽣效.如果 DependencyClass 存在于类路径上,MyBean 会被注册
@ConditionalOnMissingClass
当类路径上存在指定的类时,使⽤这个注解的配置类或Bean⽅法才会⽣效.如果D ependencyClass 不存在于类路径上, MyBean 会被注册
@ConditionalOnProperty:
这个注解允许基于配置⽂件中的属性值来注册Bean.你可以指定属性的名称和期望的值,如果配置的属性存在且匹配指定的值,则相应的Bean会被注册如果m y.property 的值是 true ,则MyBean 会被注册
我们看redis对应bean的原码就知道了
我们现在再来解决问题
我们用注解ConditionalOnProperty,这样的话,就会去看配置文件,如果配置文件中有相关信息,就会引入依赖就配置这个bean
这个是原码,havingValue是值
@ConditionalOnProperty(prefix = “spring.data.redis”, name = “host”)
这样写的意思就是配置文件中要有spring.data.redis,中要有host
这样就可以了
fastjson讲解
现在就讲一下用户信息如何在redis中存储
Redis格式定义:
key设置为:user:zhangsan
为了避免键名冲突,通常会为key添加命名空间前缀,这个前缀通常反映了键的⽤途或归属,⽐如
user: session: product: 等
value设置为⽤⼾信息的Json字符串
就是这样的
JSON⼯具类
Jackson,Gson,Fastjson
Jackson 是⼀个开源的JSON处理库,⼴泛⽤于将Java对象与JSON数据进⾏互相转换,Jackson是
Spring 框架的默认JSON解析器,拥有活跃的社区⽀持和频繁的更新迭代,所以用这个,不用引入依赖
ObjectMapper mapper = new ObjectMapper();String jsonString = mapper.writeValueAsString(yourObject);YourClass obj = mapper.readValue(jsonString, YourClass.class);
Gson是Google开发的⼀个JSON库`
Gson gson = new Gson();String json = gson.toJson(yourObject);YourClass obj = gson.fromJson(json, YourClass.class);
Fastjson 是阿⾥巴巴开源的JSON处理库,具有⾼性能的特点.
String jsonString = JSON.toJSONString(yourObject);YourClass obj = JSON.parseObject(jsonString, YourClass.class);
我们用Fastjson
先引入依赖
用这个的
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.53</version></dependency>
我们把Json的转换也搞到一个公共包里面
然后再blog-common添加依赖
这样就分装完成了
用户注册
注册用户,然后存储数据库,存储redis
原:
@Autowiredprivate Redis redis;
直接注入redis
private static final long EXPIRE_TIME = 141 * 24 * 60 * 60;private static final String USER_PREFIX = "user";
这个是过期时间和常量
然后书写buildKey方法
我们把这个方法写在blog-common中的redis中
然后调用就可以了
数据一致性方案介绍
查询用户的时候,第一用户登录的时候,用用户名查询用户信息
或者用户主页的时候,用用户id查询用户信息(自己扩展)
就是用户登录的逻辑要改变了
我们登录的时候,先从缓存中获取信息,缓存中没有的话,再从数据库中获取信息,在存入缓存
原:
现在:
因为redis有链接问题,所以要有很多的判断
然后是redis还有数据一致性问题,与mysql数据一致性
我们先测试一下
我们看到还多了一个文件夹user
然后是登录
这里还有日志
我们删掉redis对应信息
这样就成功了
所以要时刻打印日志,这样就不用调试了
数据一致性
在更新删除的时候存在这个问题
mysql中存储的数据和redis中存储数据不一样,这个就是一致性问题
万一删除失败呢
那就再次删除,两次都删除失败的概率就很低了
意思就是删除一次,后面一段时间再删除一次
方法二:就是异步更新,基于消息队列
方法三:mysql的binlog订阅同步功能(用得少)
总结
相关文章:
博客系统案例练习2-用户注册-redis
前言 用户注册 [请求]/user/register[参数]contentType: application/json{"userName":"wangwu","password":"456789","githubUrl": "https://gitee.com/bubble-fish666/spring-cloud","email": &quo…...
【人工智能】推荐开源企业级OCR大模型InternVL3
推荐开源企业级OCR大模型InternVL3 文章参考来源: https://huggingface.co/OpenGVLab/InternVL3-14B-Instruct https://www.aivi.fyi/llms/deploy-InternVL3 InternVL3,这是一个高级多模态大型语言模型 (MLLM) 系列,展示了卓越的整…...
聊天室项目
一.完善注册页面 1.完善注册页面图标,添加检测注册页面各个登录信息是否完善,并且通过信号和槽与自定义一个计时器,当注册完毕后跳转到显示注册完毕的页面。 2.各个坚持注册页面是否按要求的函数 3.完善主页面,设置信号和槽&…...
并发设计模式实战系列(4):线程池
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第四章线程池(Thread Pool),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 线程池核心组件 2. 核心…...
大模型应用案例:主动提问式的 AI 面试官(接入 DeepSeek)
目录 核心逻辑 效果演示 技术选型 大模型应用开发框架:langchain-deepseek UI 展示框架—streamlit 代码获取 后续改进想法 本文附带详细的视频讲解,欢迎小伙伴们来支持—— 【代码宇宙017】大模型:主动提问式的 AI 面试官࿰…...
算法笔记—动态规划
1137. 第 N 个泰波那契数 - 力扣(LeetCode) class Solution { public:int tribonacci(int n) {if(n0) return 0;if(n1||n2) return 1;vector<int> dp(4);//初始化dp[0]0; dp[1]1; dp[2]1;for(int i3;i<n1;i){//滚动数组优化需要循环dp[i%4]dp[…...
Vue3集成Element Plus完整指南:从安装到主题定制上
一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库,由饿了么前端团队开源维护。它提供了丰富的UI组件,能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…...
初识javascript
1. JavaScript 基础语法 (1) 变量声明 JavaScript支持三种声明变量的方式: var:传统的变量声明方式,存在作用域问题(函数作用域)。 let:块级作用域变量声明方式,避免了var的作用域问题。 co…...
C++项目 —— 基于多设计模式下的同步异步日志系统(5)(单例模式)
C项目 —— 基于多设计模式下的同步&异步日志系统(5)(单例模式) 一个问题单例模式实现1. 单例模式:全局唯一实例功能:实现细节:作用: 2. 日志器的注册与查找功能:实现…...
rag搭建,是如何进行向量匹配检索的?
RAG 里为什么要“向量检索”? 在 Retrieval-Augmented Generation (RAG) 中,我们的目标是让 LLM 能够“回答它本身不知道的内容”。做法是: 将知识(文本)进行向量化,存入向量数据库;用户提问后,也将问题向量化;去数据库里 找出与这个问题最相似的一批知识,返回喂给 …...
k8s 基础入门篇之开启 firewalld
前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙(Firewall) 定义: 防火墙是网络安全系统&…...
C++在VR/AR图形处理开发中的实战应用
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
Matlab 基于模型参考自适应法和SVPWM的异步电机控制
1、内容简介 Matlab 212-基于模型参考自适应法和SVPWM的异步电机控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
深入浅出讲解UDP检验中如何计算检验和
一、计算机中的进制:二进制与十六进制 1. 十进制(Decimal) 特点:用0-9表示,逢10进1。 例子:数字 123 表示 110221013100110221013100。 2. 二进制(Binary) 特点:用0和…...
Python类和对象一(十)
封装: 在创建对象之前,通过类将相关的属性和方法打包到一起,然后通过类来生成响应的对象 定义类: 创建对象: 方法里面有个参数self:new的对象 当我们调用类里面方法的时候,py是怎么知道是哪…...
jupyter切换存储路径
一、问题描述 当我采用官网提供的安装方式pip install jupyterlab,在Windows下的powershell里安装jupyterlab成功,并启动:jupyter lab 打开网页:http://localhost:8888/lab 显示如下:成功了,可是我发现这…...
PH热榜 | 2025-04-20
1. Checklist GG 标语:基于人工智能的清单管理工具 介绍:checklist.gg 是一款基于人工智能的检查清单管理工具,旨在帮助组织确保每次都能准确完成任务。 产品网站: 立即访问 Product Hunt: View on Product Hunt 关…...
YOLOv11改进——基于注意力机制和密集小目标增强型EVA模块的设计与实现
随着计算机视觉技术的快速发展,目标检测算法在实时性与检测精度间的平衡成为研究重点。YOLO(You Only Look Once)系列算法以其高效性和准确性,长期占据实时目标检测领域的前沿位置。然而,尽管最新版本在通用场景表现优…...
n8n 中文系列教程_04.半开放节点深度解析:Code与HTTP Request高阶用法指南
在低代码开发领域,n8n凭借其独特的半开放架构打破了传统自动化工具的边界。本文深度剖析两大核心节点——Code与HTTP Request,从底层原理到企业级实战,揭秘如何通过代码自由扩展与API无缝集成,突破平台限制。无论是对接国产生态&a…...
Linux学习——了解和熟悉Linux系统的远程终端登录
Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare,选择编辑虚拟机设置,在网络适配器设置中,选择“桥接模式”,保存设置并启动Ubuntu。 2、配置Ubuntu的…...
PFLM: Privacy-preserving federated learning with membership proof证明阅读
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
十倍开发效率 - IDEA插件之 Maven Helper
0X00 先看效果 第一个选项表示存在冲突的依赖,可以看到图片中 mysql 的连接依赖发生了冲突,在低版本的上面直接右键选择 Exclude,冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper,选择第一个进行安装&am…...
线程安全总结
1.线程安全 1.1什么是线程安全 线程安全问题指的是当多个线程同时访问和操作共享资源(如变量、数据结构等)时,由于缺乏有效的同步控制,导致程序出现不可预期的错误或数据不一致的现象。其核心在于并发操作破坏了程序的正确性。 …...
计算机视觉cv入门之答题卡自动批阅
前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步:图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…...
10.QT-显示类控件|LCD Number|ProgressBar|Calendar Widget(C++)
LCD Number QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件.类似于"⽼式计算器"的效果 属性说明intValueQLCDNumber 显⽰的数字值(int).valueQLCDNumber 显⽰的数字值(double).和intValue是联动的.例如给value设为1.5,intValue的值就是2.另外,设置value和intValue的⽅法名…...
深入探索 Unix 与 Linux:历史、内核及发行版
引言 在当今的计算世界中,Unix 和 Linux 操作系统的影响力无处不在。从驱动互联网的服务器到我们口袋里的智能手机,再到无数嵌入式设备,它们的身影随处可见 1。这两个操作系统家族共享着丰富的历史和相似的设计哲学,但又各自走过…...
HCIP第三次作业
一、实验要求 1,R5为ISP,其上只能配置IP地址;R4作为企业边界路由器, 出口公网地址需要通过PPP协议获取,并进行chap认证 2整个0SPF环境IP基于172.16.0.0/16划分; 3所有设备均可访问R5的环回; 4减少LSA的更新量,加快收敛…...
Linux 入门:基础开发工具(下)git,cgdb操作指南
目录 一.进度条 一).补充:回车与换行 二).行缓冲区 三).进度条代码 二.版本控制器Git 一).Git 安装与配置 二).创建仓库 三).开始操作 1.简单流程 2.配置公钥 1).身份…...
【上位机——MFC】消息映射机制
消息映射机制 Window消息分类消息映射机制的使用代码示例 MFC框架利用消息映射机制把消息、命令与它们的处理函数映射起来。具体实现方法是在每个能接收和处理消息的类中,定义一个消息和消息函数指针对照表,即消息映射表。 在不重写WindowProc虚函数的大…...
提交bug单时,应该说明哪些信息?
在提交 Bug 单时,为了让开发人员能够快速定位和解决问题,需要详细说明以下几方面信息: Bug 的基本信息 标题:简洁明了地概括 Bug 的主要问题,例如 “登录页面输入错误密码后提示信息不准确”。Bug 类型:明确…...
max31865典型电路
PT100读取有很多种方案,常用的惠斯通电桥,和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD,镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…...
【网工第6版】第4章 无线通信网
目录 ■ 移动通信与4G 5G技术 ▲ 移动通信发展 ▲ 移动通信制式 ▲ 移动通信技术标准 ▲ 4G标准 ▲ 4G关键技术 ◎ OFDMA ◎ 4G关键技术-MIMO ◎ 4G关键技术-SDR ◎ 4G关键技术-VolP ▲ 5G应用场景 ▲ 5G两种组网模式 ▲ 5G关键技术 ■ CDMA计算 ■ WLAN通信技术…...
辅助函数构造题目(缓慢更新,遇到更道)
题1...
图论基础:图存+记忆化搜索
图的储存 储存图有很多种方式,在此介绍两种:邻接数组,邻接表 第一种虽然简单,但访问的时间和空间花销过大,因此第二种最为常见。 让我们分别看看它们是什么 在介绍之前,我们先解释一下此处说的“图”是什…...
使用docker任意系统编译opengauss
使用docker任意系统编译opengauss 本人使用开发机器为ubuntu系统,不在官方推荐的编译系统内。但是不想为了开发opengauss重装系统。所以采用docker进行编译。 代码拉取 本人是在/home/yuyang/Documents/opengauss目录下进行操作。 先获取源代码:git clone https:/…...
JavaScript 一维数组转二维数组
题目描述: <script>const num [1,2,3,4]const out (function(num,m,n){if(num.length ! m*n){return []}const newarr []for(let i 0;i<m;i){newarr.push(num.slice(i*n,(i1)*n))}return newarr})(num,2,2)console.log(out)</script>不使用Stri…...
C#进阶学习(八)常见的泛型数据结构类(3)SortedDictionary<TKey, TValue>与SortedList<TKey, TValue>
目录 关于默认的排序可以看这篇文章的第二点中关于排序的部分: 一、SortedDictionary 1. 核心特性 2. 常用方法和属性 二、SortedList 1. 核心特性 2. 常用方法和属性 三、关于TryGetValue(TKey key, out TValue value) 方法的详细说明 (一&…...
运维侠职场日记9:用DeepSeek三天通关详解自动化操作pdf批量提取PDF文字将PDF转Word文档(附上脚本代码)
一. 痛点 运维侠小白想将pdf文档转换成word文档,但是,wps等等这些软件的转换功能都是要付费,开通会员,这该怎么办?听说python也有这个功能于是迫不及待想学… 学会基础,学习的乐趣一点点积累 基础学习成本低,掌握所需的技能要求也少,学会一两行代码,看着输出,心理慢…...
热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串
39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 ta…...
IDEA连接达梦数据库
1. 参考在IDEA中连接达梦数据库:详细配置指南_idea连接达梦数据库-CSDN博客 . jdbc:dm://127.0.0.1:5236?schemaSALES...
React Router V7使用详解
1,安装 React Router是React生态系统中最流行的路由解决方案,它允许开发者在单页应用的不同页面之间进行切换,而不需要重新加载整个页面,React Router与React框架深度集成,使得开发者在单页面应用中进行页面切换时变得轻而易举。 作为官方推荐的路由解决方案,React Rou…...
国际数据加密算法(IDEA)详解
以下是修正后的准确版本,已解决原文中的术语、符号及技术细节问题: 国际数据加密算法(IDEA) IDEA是一种分组加密算法,由Xuejia Lai(来学嘉)和James Massey于1990年设计。IDEA使用128位密钥对64位明文分组进行加密,经过8轮迭代运算后生成64位密文分组。其安全性基于…...
2025年4月19日-米哈游春招笔试题-第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 魔法网格变换术 问题描述 在魔法学院,卢小姐正在研究一种特殊的魔法网格变换术。这种魔法作用于一个 n n n...
基于STM32串口通信
基于STM32串口通信 一、串口简介 串口,也称为串行接口或串行通信接口(通常指COM接口),是一种采用串行通信方式的扩展接口。它实现了数据一位一位地顺序传送,具有通信线路简单、成本低但传送速度慢的特点。 只要一对传…...
即梦AI与可灵AI视频生成功能对比分分析
一、核心功能与特点对比 维度可灵AI(快手旗下)即梦AI(字节跳动旗下)视频生成能力✅ 支持最长3分钟视频生成(通过续写功能)✅ 1080p分辨率、30fps帧率✅ 物理模拟(流体运动、重力效果࿰…...
【任务调度】Quartz入门
Quartz 入门 代码仓库地址: GitHub:chenmeng-test-demos/demo8-task at master cmty256/chenmeng-test-demosGitee:demo8-task chenmeng/chenmeng-test-demos - 码云 - 开源中国 基本介绍 Quartz 是一个开源的作业调度框架,它完…...
【网络编程】从零开始彻底了解网络编程(二)
本篇博客给大家带来的是网络编程的知识点,. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 1. …...
常见浏览器 WebDriver 驱动下载
以下是常见浏览器 WebDriver 驱动的下载地址及注意事项,综合多个可靠来源整理而成: 一、Chrome 浏览器(ChromeDriver) 官方下载地址 http://chromedriver.storage.googleapis.com/index.html • • 版本匹配:需与 Chro…...
【每日八股】复习计算机网络 Day3:TCP 协议的其他相关问题
文章目录 昨日内容复习TCP 的四次挥手?TCP 为什么要四次挥手?在客户端处于 FIN_WAIT_2 状态时,如果此时收到了乱序的来自服务端的 FIN 报文,客户端会如何处理?何时进入 TIME_WAIT 状态?TCP 四次挥手丢了怎么…...
大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...