全链路优化:如何让单点登录认证接口并发性能翻倍?
背景
最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。
Nginx配置优化
在并发认证场景下,Nginx 是系统的第一个请求处理层,优化其配置可以有效提高系统的吞吐量和响应速度。
基本配置
工作进程数
工作进程数(worker_processes
)配置为服务器 CPU 核心数,使用 auto
可以自动匹配 CPU 核心数。
# worker_processes 4;
worker_processes auto;
设置为auto后在4核CPU环境下会启动5个进程(4个工作进程):
1 个 master process: Nginx 的主进程,用于启动、关闭和管理 Nginx 的工作进程。
4 个 worker process: Nginx 的 4 个工作进程(Worker Process),用于实际处理请求。
最大连接数
Nginx 的默认配置中,每个工作进程的最大连接数(worker_connections
)的默认值通常是 1024。
events {worker_connections 65535; # 工作进程的最大连接数multi_accept on; # 一次性接受尽可能多的连接use epoll; # 使用 epoll 模型,适合高并发
}
Nginx 服务器最大能够支持的并发连接数是由 worker_processes
和 worker_connections
两者共同决定的。最大连接数 = worker_processes * worker_connections / 2 ,读和写会分别占用连接数。
注意: 增大 worker_connections
值时,需要确保系统的文件描述符(ulimit -n)设置足够高,否则会出现 Too many open files
错误。
文件描述符
文件描述符限制,Nginx 进程能打开的最大文件描述符数量,建议配置为系统最大值,通常与 ulimit -n
保持一致。
worker_rlimit_nofile 65535;
在高并发环境中,Nginx 作为反向代理服务器或负载均衡器,需要同时处理大量的客户端请求。这些请求可能涉及到以下几类文件描述符:
- 客户端连接:每一个客户端连接(HTTP 请求)会占用一个文件描述符。
- 代理到后端服务器的连接:Nginx 作为反向代理时,与后端服务器的连接也会占用文件描述符。
- 静态资源文件:当 Nginx 作为 Web 服务器提供静态资源(HTML、CSS、JS 等)时,打开文件资源也会使用文件描述符。
- 日志文件:Nginx 需要记录访问日志和错误日志,这些日志文件也会占用文件描述符。
测试3000个请求过程中各个工作进程下文件描述符情况如下:
可以看到各个工作进程都在进行请求,有一定数量的文件描述符创建。
如果文件描述符数量配置过少,在高并发时,Nginx 会因为没有足够的文件描述符而拒绝新的连接,出现 too many open files
的错误。Nginx文件描述符配置和系统文件描述符配置区别:
Nginx文件描述符 (worker_rlimit_nofile) | 系统文件描述符 | |
---|---|---|
配置对象 | Nginx worker 进程 | 操作系统、Shell 用户 |
配置范围 | 仅限于 Nginx worker 进程 | 整个系统或单个用户 Shell 环境 |
Gzip 压缩
Nginx 开启 Gzip 压缩,减少传输数据量,提升响应速度。
gzip on;
gzip_disable msie6;
gzip_vary on; # 启用 Vary 响应头,适配不同浏览器
gzip_proxied expired no-cache no-store private auth;
gzip_comp_level 6; # 设置压缩级别为 5-6,平衡性能和压缩率
gzip_buffers 16 8k; # 设置缓冲区大小
gzip_http_version 1.1; # 使用 HTTP/1.1 协议进行压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
浏览器会自动处理 Gzip 解压缩。当服务器返回的响应数据是经过 Gzip 压缩的,浏览器会根据 HTTP 响应头中的 Content-Encoding: gzip
自动识别并解压缩数据,然后再进行解析和渲染,用户无需做任何额外操作。
Gzip 解压缩流程
- 浏览器发送请求
浏览器发送请求时,默认会在 Accept-Encoding
请求头中加入 gzip
或 br
(Brotli),告知服务器它支持 Gzip 或 Brotli 压缩。
GET /web/login HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br
- 服务器响应请求
服务器检测到浏览器支持 Gzip 压缩,并且符合压缩条件,就会对返回的数据进行 Gzip 压缩,并在响应头中加入 Content-Encoding: gzip
。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Encoding: gzip
- 浏览器处理响应
浏览器接收到 Content-Encoding: gzip
的响应后,会自动进行解压缩,然后渲染页面或解析数据。
Gzip 解压缩测试
可以使用 curl
来测试是否启用了 Gzip 压缩:
curl -k -I -H "Accept-Encoding: gzip" https://your-nginx-server.com
- 如果返回头中包含
Content-Encoding: gzip
,则说明 Gzip 压缩已启用。
日志配置
高并发下,频繁的日志写入可能会成为性能瓶颈。可以调整日志级别、禁用日志或者使用异步记录日志。
access_log off;
# access_log /var/log/nginx/access.log combined buffer=32k flush=5s aio=on;
error_log /var/log/nginx/error.log error;
配置解释:
- 禁用日志:access_log off
- 日志记录级别设置error,日志级别:debug < info < notice < warn < error < crit < alert < emerg
aio=on
:开启异步 I/O 操作,结合buffer
,提高日志写入性能。日志缓冲 (buffered logging
) 和flush
选项:最简单的提升性能方式。syslog
异步记录:更为彻底的异步处理方式,通过系统日志服务进行处理。
Tomcat配置优化
配置 Tomcat 的连接数和线程池优化设置,提高认证服务对大量请求的处理能力和响应效率。
server:tomcat:max-connections: 20000 #Tomcat可以接受的最大连接数10000accept-count: 400 #请求队列200threads:max: 400 #最大线程数200min-spare: 200 #最小空闲线程数10
连接数与请求队列优化
max-connections: 20000
Tomcat 最大连接数设置为 20000,允许同时维护的客户端连接数增加,适用于需要大量并发连接的场景。
-
- 避免因连接数不足导致的连接拒绝问题。
- 提高高并发时的吞吐量。
accept-count: 400
设置请求队列的最大长度。当连接数达到 max-connections
时,超过此队列长度的请求将被拒绝。
-
- 适当增加队列长度,减少高负载下的连接拒绝几率。
线程池优化
threads.max: 400
设置最大线程数为 400,允许最多同时处理 400 个请求。
-
- 提高服务并发处理能力,减少请求阻塞时间。
threads.min-spare: 200
设置最小空闲线程数为 200,预留线程以应对突发请求流量。
-
- 缩短高并发场景下的线程初始化时间。
通过测试逐步调整连接数和线程数的数量,以找到适合的配置参数。
Redis操作优化
选择合适的数据结构
设计时选择合理的数据结构存储目标数据,例如用户资源账号授权关系使用 Redis 的 Hash 结构进行存储。
避免Redis中keys操作
注意避免keys *操作,在大数据量会阻塞 Redis,严重影响 Redis 性能。可使用SCAN命令代替,它是非阻塞的,可以分批次扫描数据。
避免Redis的isExist冗余查询
如果能够通过返回是否null即可判断的情况,就不再去isExist冗余查询
通过减少Redis连接查询次数,可减少网络资源消耗。
本地缓存优化(二级缓存)
将一些热点的 key 存储在本地缓存中是为了加速访问频率较高的数据,减轻 Redis 服务的压力,提升整体系统性能。
热点 Key 的特性
- 高访问频率:某些 key 被频繁访问,占用了 Redis 的网络 I/O 和处理资源。
- 数据变化少:热点数据通常是读取操作较多,写入频率较低,因此适合缓存。
- 时效性可控:热点数据一般对实时性要求不高,可以接受短时间的延迟更新。
批量操作与管道 (Pipelining)
Redis 的每个请求都会涉及一次客户端和服务端的网络通信。传统模式下,发送 1000 个请求需要 1000 次往返,而使用 Pipeline 后,可以一次性发送所有请求,减少了网络延迟开销从而提升性能。
private void pubMessages(List<Message<?>> messages, String channel) {redisTemplate.executePipelined((RedisCallback<List<Object>>) connection -> {for (Message message : messages) {// 发布日志消息 通过一批次处理100条connection.publish(channel.getBytes(), JsonUtils.toJson(message).getBytes());}return null;});}
Redis连接池
配置 Redis 连接池,减少连接创建开销。调整系统环境上合适的连接池的参数,如最大连接数、最小空闲连接数。
redisson:threads: 0 #Redisson使用的线程池大小,可设置CPU核心数nettyThreads: 0 #Netty线程池的大小,决定Netty I/O线程数,处理Redis网络请求,可设置CPU核心数connectPoolSize: 1000 #Redis连接池的最大连接数connectPoolIdleSize: 100 #连接池中最小的空闲连接数,应对突发请求能够迅速响应,而不需要创建新的连接connectTimeout: 10000 #客户端在等待 Redis 服务端响应连接请求的最长时间
public RedissonClient redisson() throws IOException {Config config = new Config();threads = (threads == 0 ? Runtime.getRuntime().availableProcessors() : threads);nettyThreads = (nettyThreads == 0 ? Runtime.getRuntime().availableProcessors() : nettyThreads);config.setThreads(threads);config.setNettyThreads(nettyThreads);config.setTransportMode(TransportMode.NIO);// ...return Redisson.create(config);}
合理配置 Redis
禁用 AOF 持久化
AOF(Append-Only File)是 Redis 的持久化方式,按顺序记录每次写操作命令并追加到日志文件中,支持精确的数据恢复。其性能消耗主要来自磁盘 I/O,受 appendfsync
配置影响:always
性能最差但最安全,everysec
性能与可靠性折中,no
性能最好但可能宕机时丢失数据。
如果业务需要更高性能时,禁用 AOF 持久化,Redis 不会将写操作日志追加到 AOF 文件中,减少磁盘 IO 开销。
appendonly no # 禁用 AOF 持久化
如果需要数据持久化场景,当配置appendonly yes时,通过设置appendfsync来控制日志写入频率。
appendfsync everysec
RDB 快照频率
RDB(Redis Database)是 Redis 的一种快照持久化方式,它会按照指定的触发条件(如时间或键的变化数)将内存中的数据保存到磁盘文件中。RDB 的特点是文件小,适合全量备份,但在保存快照的过程中会消耗 CPU 和磁盘 I/O 资源,特别是对于大数据量或高并发场景。
可以通过禁用 RDB 持久化或者调整持久化策略来提升性能。
#save "" # 禁用 RDB 持久化
save 3600 1000
# 每隔 3600 秒(1小时) 检查一次是否需要保存快照。
# 操作条件(1000 次): 如果在这段时间内,有 至少 1000 次数据修改操作,Redis 就会触发一次快照保存。
Redis I/O 多线程(Redis 6.0 及以上版本)
Redis I/O 多线程功能主要针对网络 I/O 的性能瓶颈,通过多线程并发处理 Redis 的读写请求,将网络 I/O 操作分配给多线程处理,提升吞吐量和响应速度,适合高性能服务器场景。Redis 默认是单线程处理网络请求,即使开启了多线程功能,也是默认只用于写操作。设置 io-threads-do-reads yes
后,Redis 会同时使用多线程处理读请求和写请求,适用于 CPU 核心数较多,并且CPU没有充分占满的场景。
io-threads 4 # 配置 I/O 线程数量
io-threads-do-reads yes # 是否启用多线程处理读操作
可部署时通过脚本动态判断当前系统CPU核心数来决定是否启用I/O多线程。如果CPU核心数大于 16,表示这是一个高性能服务器,适合启用 Redis 的 I/O 多线程功能。
- 对于 CPU 核心较少的服务器,开启 I/O 多线程可能导致性能下降。I/O 多线程的性能提升更多地体现在网络 I/O,而非 Redis 内部操作,因此适用于客户端数量多、网络 I/O 密集的场景。
- 通过测试逐步调整
io-threads
的数量,以找到适合的线程数,避免线程过多带来的上下文切换开销。
避免冗余查询
合并一些配置类的缓存到一个对象中,或者同一个配置类的缓存在一次认证方法调用中,只需要通过一次查询后以参数的形式进行传递,减少Redis的冗余查询次数。
一些通用优化
异步操作
能异步的都尽量异步执行,比如日志的记录,消息的发送等。
批量操作
1. Kafka消息批量处理
- 批量消息消费
@KafkaListener(topics = "user", groupId = "user", containerFactory = "batchKafkaListenerContainerFactory")
public void userLogListener(ConsumerRecords<String, Message<?>> records) {
}
- 描述:这个方法是针对批量 Kafka 消息的消费,即每次从 Kafka 消息队列中拉取一批消息 (
ConsumerRecords
),然后对这批消息进行处理。 - 特点:
-
- 一次性处理多条消息,
ConsumerRecords
是 Kafka 提供的批量消费的数据结构,包含多条Message<?>
消息。 - Kafka 消费者可以配置
max.poll.records
参数,指定每次最多拉取多少条消息。
- 一次性处理多条消息,
- 性能:
-
- 高吞吐量:批量处理能够减少 Kafka 拉取请求的次数,并行处理多条消息,提高吞吐量。
- 可能增加延迟:在消息量较小时,Kafka 需要等待足够多的消息到达,才会形成一个批次,这可能会导致消息延迟增加。
从性能角度来看,批量消费方式的吞吐量要远高于单条消费方式,但可能会带来稍微高一些的延迟。因此,具体选择需要根据业务需求和负载特点进行权衡。
数据库批量保存
认证日志等操作进行Kafka批量订阅后批量保存,可使用mybatisplus的批量保存saveBatch方法。
public Result<String> batchAdd(List<LogLogin> logLoginList) {// ...logLoginService.saveBatch(loginList);// ...}
日志打印
减少系统中不必要的LOG日志后台输出或调高日志级别。
Java线程池配置
合理配置Java执行任务线程池大小,核心线程数、最大线程数、工作队列大小。
@Bean("executeTaskExecutor")public Executor taskExecutor(){ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();executor.setThreadPriority(8);executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()*3);executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*3);executor.setQueueCapacity(100);executor.setKeepAliveSeconds(120);executor.setThreadGroupName("global-thd-");executor.setThreadNamePrefix("custom-task-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setWaitForTasksToCompleteOnShutdown(true);executor.initialize();return TtlExecutors.getTtlExecutor(executor);}
JVM优化
Java8默认垃圾回收器是-XX:+UseParallelGC,尝试设置 G1 垃圾收集器(G1 是一种低延迟、高吞吐量的垃圾回收器,适合大内存的应用)
- 指定 JVM 内存大小(动态根据服务器内存自动配置),设置固定值避免内存收缩。
- 垃圾回收器设置(
-XX:+UseG1GC
)并设置垃圾回收暂停时间目标(-XX:MaxGCPauseMillis=300
)
系统参数优化
Linux操作系统相关可优化操作。
文件描述符
文件描述符是操作系统用来表示打开的资源(如文件、套接字),对于网络连接,文件描述符主要用于表示 TCP/UDP 套接字。操作系统对每个进程的文件描述符数量有限制(通常是 1024 或更高)。如果连接数超过限制,将导致无法接收新连接。为了提高系统网络连接性能,可通过ulimit -n
命令配置系统的文件描述符限制。
ulimit -n 65535
TCP协议连接队列大小
在Linux系统高并发场景下,半连接队列(SYN 队列)和全连接队列(accept 队列)的大小限制可能成为性能瓶颈。
通过调高这两个队列的大小,可以:
- 增强瞬时抗压能力,服务器可以容纳更多未处理的连接,减少丢包和连接失败。
- 在流量高峰期,增加缓冲能力,使得连接能够被逐步处理,而不是直接丢弃。
通过模拟网络连接测试发现,当服务端并发处理大量请求时,如果TCP全连接队列过小,就容易溢出。发生TCP全连接队溢出的时候,后续的请求就会被丢弃,这样就会出现服务端请求数量上不去的现象。
半连接队列
服务器来不及处理握手完成,队列被填满,导致连接失败。
- 查看半连接队列大小
半连接队列的大小由 tcp_max_syn_backlog
参数决定。默认大小1024,如果队列满了,多余的连接会被丢弃。
[root@centos ~]# sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 256
- 调整半连接队列大小
sysctl -w net.ipv4.tcp_max_syn_backlog=256
将参数写入 /etc/sysctl.conf
配置文件,永久生效。
echo "net.ipv4.tcp_max_syn_backlog = 256" >> /etc/sysctl.conf
# 当执行sysctl -p命令时,系统会读取/etc/sysctl.conf文件中的配置并应用这些设置
sysctl -p
全连接队列
应用层的处理速度跟不上握手完成速度,队列满载,连接被拒绝。
- 查看全连接队列大小
全连接队列的大小由 tcp_max_syn_backlog
参数决定。默认大小128,如果队列满了,多余的连接会被丢弃。
[root@centos ~]# sysctl net.core.somaxconn
net.core.somaxconn = 512
- 调整全连接队列大小
sysctl -w net.core.somaxconn=512
将参数写入 /etc/sysctl.conf
配置文件,永久生效。
echo "net.core.somaxconn = 512" >> /etc/sysctl.conf
ss -s 命令查询系统网络连接情况
Total: 1473 (kernel 2330) :总共的网络连接数量为 1473,其中内核维护的连接数为 2330。这个数字表示当前系统在内核层面维护的所有连接(包括已建立的连接和其他状态的连接)。
传输层协议统计(主要是 TCP)
- TCP: 926 (estab 881, closed 3, orphaned 0, synrecv 0, timewait 2/0) :
-
- estab 881:表示当前有 881个 TCP 连接是已建立的连接(
ESTABLISHED
状态)。 - closed 3:表示当前有 3个 TCP 连接已经关闭。
- orphaned 0:表示当前有 0 个连接处于“孤儿”状态(通常是异常连接)。
- synrecv 0:表示当前没有处于 SYN_RECV 状态的连接。SYN_RECV 状态表示接收到连接请求并且正在等待确认。
- timewait 2/0:表示当前有 2个连接处于
TIME_WAIT
状态,0 表示没有正在进行的连接处于半关闭状态。TIME_WAIT
状态表示连接已关闭,但仍需要保持一段时间,以确保双方都知道连接关闭。
- estab 881:表示当前有 881个 TCP 连接是已建立的连接(
ss -lnt 命令可查询系统的TCP连接情况
ss -lnt
# -l 显示正在监听的socket(listening)
# -n 不解析服务名称
# -t 只显示tcp socket
在「LISTEN 状态」时,Recv-Q/Send-Q
表示的含义如下:
Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端 accept()的TCP连接;
Send-Q:当前全连接最大队列长度,上面的输出结果说明监听8443端口的TCP服务,最大全连接长度为511;
在「非LISTEN状态」时,Recv-Q/Send-Q表示的含义如下:
- Recv-Q:已收到但未被应用进程读取的字节数;
- Send-Q:已发送但未收到确认的字节数;
总结
本次优化从 Nginx、Redis、Tomcat、TCP、批量操作、二级缓存等多个角度入手,最终在 8核16G 环境下,将认证系统的并发性能翻倍。
🌟 你的支持是我持续创作的动力,欢迎点赞、收藏、分享!
相关文章:
全链路优化:如何让单点登录认证接口并发性能翻倍?
背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...
基于大语言模型的推荐系统(1)
推荐系统(recommendation system)非常重要。事实上,搜索引擎,电子商务,视频,音乐平台,社交网络等等,几乎所有互联网应用的核心就是向用户推荐内容,商品,电影&…...
嵌入式八股文(四)计算机网络篇
目录 第一章 基础概念 1. 服务 2. 协议 3. 接口 4. 网络体系结构 5. OSI七层模型 6. TCP/IP四层参考模型 7. 最大传输单元MTU及分片操作 8. 流量控制 9. 数据链路层提供的功能 10. 汇集树 11. 生成树协议 12. 拥塞控制及途径 6. 包调度 7. 隧道 8. 抖动 9. 逆…...
【龙智】Confluence到期日提醒插件Data Center v1.8.0发布:Confluence 9兼容、表格提醒强化,Slack通知升级
还在为Confluence中重要内容的逾期而焦头烂额? 还在苦于手动核查任务的截止日期? 不仅效率低下,还时常遗漏关键信息? 别担心,你的帮手来了! Confluence到期日提醒插件——由Atlassian全球白金合作伙伴龙…...
Luckfox Pico Max运行RKNN-Toolkit2中的Yolov5 adb USB仿真
1:下载rknn-toolkit2 git clone https://github.com/rockchip-linux/rknn-toolkit2 2:修改onnx目录下的yolov5的test.py的代码 # pre-process config print(--> Config model) rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, …...
AI IDE - Trae -学习与实践
1.应用场景 主要用于使用AI IDE进行快速的开发,提高开发效率;节约开发时间; 额外话:可以预见搞出来的东西终将取代了我们自身; 2.学习/操作 1.文档阅读 Trae - Ship Faster with Trae -- 官网,下载安装 …...
内外网文件传输 安全、可控、便捷的跨网数据传输方案
一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 安全性风险:内外网直连可能导致病毒传播、数据泄露。 操作繁琐:传统方式需频繁切换网络环境&…...
pycharm 调试 debug 进入 remote_sources
解决办法1: pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"(此时文件夹会变为蓝色)。 解决方法2 Debug:使用Pychar…...
Docker国内镜像源部署deepseek
部署deepseek时Docker拉取国内镜像失败可能是由于国内网络环境复杂或镜像源配置不正确导致的。 具体原因可能包括: 网络问题:国内网络环境复杂,可能导致访问国内镜像仓库的速度较慢或无法访问,进而影响Docker镜像的拉取…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_specific_init函数
ngx_os_specific_init 声明在 src/os/unix/ngx_os.h ngx_int_t ngx_os_specific_init(ngx_log_t *log); 定义在 src\os\unix\ngx_linux_init.c ngx_int_t ngx_os_specific_init(ngx_log_t *log) {struct utsname u;if (uname(&u) -1) {ngx_log_error(NGX_LOG_ALERT, log,…...
C++算法基础笔记
算法学习 C语法字符和字符串输入输出输出控制 字符串拼接和扩充检查字符串是否存在大写、小写字母字符数组换行 C语法 字符和字符串输入输出 在C 中使用如下语法实现对容器中的对象进行遍历,类似于js或python的for in语法 for (element_declaration : container)…...
江苏地区电子行业DeepSeek AI+OdooERP业务升级规划方案
作者:Odoo技术开发/资深信息化负责人 日期:2025年2月22日 一、江苏电子行业现状与痛点分析 行业特点 产业集群效应显著:江苏电子产业以无锡、苏州、南京为核心,形成了涵盖PCB、集成电路、新能源、智能终端等领域的完整产业链&…...
Spring事务原理 二
在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…...
【实用工具】在 Windows 上使用 JVMS 管理多版本 JDK
文章目录 前言JVMS 的主要功能安装 JVMS初始化 JVMS管理 JDK 版本远程添加(这块比较吃网络,如果不成功可以看下面手动添加)安装指定版本的 JDK查看本地已安装的 JDK 版本切换 JDK 版本 手动添加 JDK 前言 在 Java 开发过程中,针对…...
前端面试-JavaScript 数据类型详解
目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型(原始类型&…...
Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务
一、 报错: navicat连接数据库报错:ORA-12541:TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置:listener.ora 及 listener*.bak相关的 cmd,用管理员打开 执行:netca 命…...
go-micro
一,课程介绍 1,主讲老师: 大地 2,合作网站: www.itying.com 3,我的专栏: https://www.itying.com/category_Z9-b0.html 4,必备基础:学习本教程要有golang和go web基础 5,大地老师Golang入门实战系列教…...
SVN把英文换中文
原文链接:SVN设置成中文版本 都是英文,换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数
ngx_atoi 声明在 src/core/ngx_string.h ngx_int_t ngx_atoi(u_char *line, size_t n); 定义在 src/core/ngx_string.c ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n 0) {return NGX_ERROR;}cutoff NGX_MAX_INT_T_VALUE / 10;cutlim…...
DeepSeek R1/V3满血版——在线体验与API调用
前言:在人工智能的大模型发展进程中,每一次新模型的亮相都宛如一颗投入湖面的石子,激起层层波澜。如今,DeepSeek R1/V3 满血版强势登场,为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...
深度学习技术文章质量提升指南(基于CSDN评分算法优化)
一、质量缺陷诊断(基于CSDN质量分V5.0算法) 根据1提供的评分框架,当前文章可能存在的质量短板: 技术深度不足:缺乏具体模型实现细节与数学推导结构完整性缺失:未形成"理论-实践-应用"完整闭环代…...
力扣-回溯-37 解数独
思路 双层递归,而且在传递参数使用&的好处是不用在复制一次样本,浪费时间 class Solution { public:bool isVaild(vector<vector<char>> &board, int row, int cal, char val){for(int i 0; i < 9;i){if(board[row][i] val) …...
极简入门,本地部署dify低代码平台构建AI Agent大模型全流程(使用教程、微案例、配置详解、架构图解析)
文章目录 一、环境搭建1.1 安装VMware-workstationCentOS7.91.2 安装宝塔1.3 安装docker及改镜像、安装dify1.4 配置模型供应商 二、dify快速上手体验2.1 知识库2.2 微案例:基于知识库的助手 三、dify知识库配置详解3.1 分片策略3.2 父子分段3.3 索引方法3.4 检索结…...
ssh与服务器
目录 前言: 一、密码连接 二、密钥对连接 1.将公钥放在服务器 2.ssh连接 三、禁用密码 1.进入服务器/etc/ssh文件夹 2.打开sshd_config文件,进行如下配置 3.有可能还需要更改其他文件夹 4.重启ssh服务 四、config 五.ssh与github 1.本地创建…...
C++ bind基本使用
std::bind 是 C11 引入的一个函数模板,用于创建一个新的可调用对象,该对象可以调用某个函数或成员函数,并将一些参数绑定为固定值。通过 std::bind,你可以创建一个新的函数对象,这个对象可以接受剩余的参数,…...
【GPT】从GPT1到GPT3
every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 从GPT1 到GPT3 1. GPT1 论文: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/lan…...
Java IO 设计模式总结
装饰器模式 装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。 装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。 对…...
js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性
ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言,本文讲述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,帮助朋友们更好的熟悉和使用Javascript ES5 1.严格模式 use strict2.Object getPrototypeOf,返回一个对象的原…...
基于ffmpeg+openGL ES实现的视频编辑工具-解码(四)
在开发视频编辑工具时,预览功能是基石,它涵盖视频、图片以及音频播放,而视频解码则是实现视频预览及后续编辑操作的关键环节。本文聚焦于基于 FFmpeg 实现视频解码的过程,详细阐述开发中遭遇的痛点、对应的解决方式,以及核心代码的运作原理。 一、开发背景与目标 视频编…...
机器学习:决策树
1. 初步概念 决策树是一种基于分裂特征的机器学习方法,用于分类和回归任务。它通过将数据按特征值进行分割,最终做出预测。与线性模型不同,决策树能够自动识别重要的特征,并根据数据情况生成复杂的决策规则。 2. 决策树的核心思想 决策树的核心思想在于选择一个特征作为…...
@media 的常用场景与示例
media 的常用场景与示例 1. 基本概念2. 常用场景2.1 不同屏幕宽度的布局调整2.2 隐藏或显示元素2.3 字体大小调整2.4 图片大小调整2.5 高度调整2.6 颜色调整2.7 鼠标悬停效果 3. 常用示例3.1 基本响应式布局3.2 隐藏侧边栏3.3 字体大小和图片大小 4. 总结 在现代网页设计中&…...
深入浅出:基于SpringBoot和JWT的后端鉴权系统设计与实现
文章目录 什么是鉴权系统定义与作用主要组成部分工作原理常用技术和框架 基于SpringBoot JWT的鉴权系统设计与实现指南前言技术对比令牌技术JWT令牌实现全流程1. **依赖引入**2. **JWT 工具类**3. **JWT 拦截器(Interceptor)** 4. **拦截器注册**5. **登…...
怎麼利用靜態ISP住宅代理在指紋流覽器中管理社媒帳號?
靜態ISP住宅代理是一種基於真實住宅IP的代理服務。這類代理IP通常由互聯網服務提供商(ISP)分配,具有非常高的真實性,與普通數據中心代理相比,更不容易被平臺檢測到為“虛假IP”或“代理IP”,靜態ISP住宅代理…...
DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发
Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…...
解决本地模拟IP的DHCP冲突问题
解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中,如果本机原有 IP(如 192.168.2.7)是通过 DHCP 自动获取的,直接添加新 IP(如 10.0.11.11)可能会导致 DHCP 服…...
Git LFS介绍(Large File Storage)大文件扩展,将大文件存储在外部存储,仓库中只记录文件的元数据(大文件的指针,类似一个小的占位符文件)
文章目录 LFS的功能?如何使用LFS?将大文件存储在外部系统是什么意思?具体是如何运作的?为什么要这样做? 对开发者的影响?1. **性能和效率**2. **协作体验**3. **版本管理差异**4. **额外的工具和配置** LFS…...
数据中心储能蓄电池状态监测管理系统 组成架构介绍
安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高,蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性,分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...
三甲医院网络架构与安全建设实战
一、设计目标 实现医疗业务网/卫生专网/互联网三网隔离 满足等保2.0三级合规要求 保障PACS影像系统低时延传输 实现医疗物联网统一接入管控 二、全网拓扑架构 三、网络分区与安全设计 IP/VLAN规划表 核心业务配置(华为CE6865) interface 100G…...
如何在 React 中测试高阶组件?
在 React 中测试高阶组件可以采用多种策略,以下是常见的测试方法: 1. 测试高阶组件返回的组件 高阶组件本身是一个函数,它返回一个新的组件。因此,可以通过测试这个返回的组件来间接测试高阶组件的功能。通常使用 Jest 作为测试…...
INA219电流、电压、功率测量芯片应用
INA219电流、电压、功率测量芯片应用 简述芯片引脚应用电路寄存器驱动代码 简述 INA219是一款由德州仪器(Texas Instruments)生产的高精度电流/功率监测芯片,广泛应用于电池监控、电源管理等需要精确电流和功率测量的应用中。该芯片通…...
深入解析设计模式之工厂模式
深入解析设计模式之工厂模式 在软件开发的复杂体系中,设计模式作为解决常见问题的有效方案,为开发者提供了强大的工具。工厂模式作为一种广泛应用的创建型设计模式,专注于对象的创建过程,通过巧妙的设计,将对象的创建…...
ollama修改监听ip: 0.0.0.0
确认Ollama绑定IP地址 默认情况下,Ollama可能仅监听本地回环地址(127.0.0.1)。要允许外部访问,需将其配置为监听所有IP(0.0.0.0)或指定IP(如10…19)。 修改启动命令(推荐…...
.NET MVC实现电影票管理
.NET MVC(Model-View-Controller)是微软推出的基于 Model-View-Controller 设计模式的 Web 应用框架,属于 ASP.NET Core 的重要组成部分。其核心目标是通过清晰的分层架构实现 高内聚、低耦合 的开发模式,适用于构建可扩展的企业级…...
FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器
本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分: 信号生成:展示如何使用DDS&am…...
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)
Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义参考: 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join,集成mysql cdc等参考: 大数据组件(四)快速入门实时数据…...
vue3父子组件props传值,defineprops怎么用?(组合式)
目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量,修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props(:props“”)传递数据给子组件 <!-- 父组件…...
Linux /etc/fstab文件详解:自动挂载配置指南(中英双语)
Linux /etc/fstab 文件详解:自动挂载配置指南 在 Linux 系统中,/etc/fstab(File System Table)是一个至关重要的配置文件,它用于定义系统开机时自动挂载的文件系统。如果你想让磁盘分区、远程存储(如 NFS&…...
Test the complete case
Test the complete case python写的一段 由pytest测试框架/allure报告框架/parameters数据驱动组成的完整案例代码 目录结构 project/ ├── test_cases/ │ ├── __init__.py │ └── test_math_operations.py # 测试用例 ├── test_data/ │ └── math_dat…...
装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
问题描述 我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢? 原因分析: 当您在安装Windows操作系统…...
【pytest-jira】自动化用例结合jira初版集成思路
【pytest】编写自动化测试用例命名规范README 【python】连接Jira获取token以及jira对象 【python】解析自动化脚本文件并按照测试周期存储记录 【python】向Jira推送自动化用例执行成功 【python】向Jira测试计划下,附件中增加html测试报告 以下内容主要是介绍jira…...