SpringBoot默认并发处理(Tomcat)、项目限流详解
SpringBoot默认并发处理
在 Spring Boot 项目中,默认情况下,同一时间能处理的请求数由内嵌的 Tomcat 服务器的线程池配置决定。
默认并发处理能力
请求处理流程
- 请求到达:新请求首先进入 TCP 连接队列(最大 max-connections)。
- 线程分配:
如果有空闲线程,立即处理请求。 - 如果所有线程繁忙,请求进入等待队列(最多 accept-count 个)。
队列满时:若等待队列已满,直接返回 Connection refused 错误(HTTP 503)。
配置调整
在 application.properties 或 application.yml 中修改默认值:
# 调整 Tomcat 线程池参数
server.tomcat.threads.max=500 # 提高最大工作线程数
server.tomcat.accept-count=200 # 增大等待队列长度
server.tomcat.max-connections=10000 # 增加 TCP 连接队列容量
限流业务场景
在短时间内,接口承载成千上万的请求,首先要考虑程序的并发性。大流量会直接将系统打垮,无法对外提供服务。那为了防止出现这种情况最常见的解决方案之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。在 Spring Boot 中,常见的限流算法包括 计数器算法、漏桶算法、令牌桶算法,以及 Resilience4j 和 Spring Cloud Gateway 的集成方案。
常见限流算法
固定窗口计数器限流
原理
在固定时间窗口(如1秒)内统计请求数,超过阈值则拒绝请求。
缺点:存在窗口临界突发问题(如窗口切换时请求翻倍)。
实现示例
@Component
public class FixedWindowCounter {private final AtomicInteger counter = new AtomicInteger(0);private final int limit = 100; // 每秒100个请求@Scheduled(fixedRate = 1000) // 每秒重置计数器public void resetCounter() {counter.set(0);}public boolean allowRequest() {return counter.incrementAndGet() <= limit;}
}// 在Controller中使用
@RestController
public class ApiController {@Autowiredprivate FixedWindowCounter counter;@GetMapping("/api")public ResponseEntity<String> handleRequest() {if (counter.allowRequest()) {return ResponseEntity.ok("Success");} else {return ResponseEntity.status(429).body("Too Many Requests");}}
}
滑动窗口计数器限流
原理
将时间窗口划分为多个小窗口(如1秒分为10个100ms的窗口),统计最近N个小窗口的总请求数。
优点:平滑过渡,减少临界问题。
实现示例
@Component
public class SlidingWindowCounter {private final LinkedList<Long> timestamps = new LinkedList<>();private final int windowSize = 1000; // 时间窗口1秒private final int limit = 100; // 窗口内最多100个请求public synchronized boolean allowRequest() {long now = System.currentTimeMillis();// 移除超出时间窗口的旧记录while (!timestamps.isEmpty() && now - timestamps.getFirst() > windowSize) {timestamps.removeFirst();}if (timestamps.size() < limit) {timestamps.addLast(now);return true;}return false;}
}
漏桶算法(Leaky Bucket)
漏桶算法原理
漏桶算法是一种流量整形技术,用于控制请求的处理速率,确保系统平稳处理流量。其核心思想如下:
桶容量(Capacity):桶的最大请求容量,超过则拒绝新请求。
恒定漏出速率(Leak Rate):以固定速率处理请求(如每秒处理10个请求)。
请求处理流程:
请求到达时,若桶未满,加入队列等待处理。
桶满时,新请求被拒绝。
漏桶以恒定速率从队列取出请求处理。
漏桶算法示例
- 漏桶的容量和漏出速率
// application.yml
leaky-bucket:capacity: 10 # 桶容量(最多容纳10个请求)leak-rate: 1000 # 漏出速率(每1000毫秒处理1个请求)// LeakyBucketConfig
@Configuration
@ConfigurationProperties(prefix = "leaky-bucket")
@Data
public class LeakyBucketConfig {private int capacity; // 桶容量private long leakRate; // 漏出速率(毫秒)
}
- 实现漏桶算法
@Component
public class LeakyBucket {private final Queue<Request> bucket = new ConcurrentLinkedQueue<>();private final int capacity;private final long leakRate;public LeakyBucket(LeakyBucketConfig config) {this.capacity = config.getCapacity();this.leakRate = config.getLeakRate();this.initLeakTask();}// 初始化漏出任务private void initLeakTask() {ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(this::leak, 0, leakRate, TimeUnit.MILLISECONDS);}// 处理漏出请求private void leak() {if (!bucket.isEmpty()) {Request request = bucket.poll();request.process();}}// 尝试加入请求public boolean tryAddRequest(Request request) {if (bucket.size() < capacity) {return bucket.offer(request);}return false;}
}
- 请求处理类
public class Request {private final String data;public Request(String data) {this.data = data;}public void process() {System.out.println("处理请求: " + data + ",时间: " + new Date());}
}
- controller
@RestController
public class ApiController {private final LeakyBucket leakyBucket;public ApiController(LeakyBucket leakyBucket) {this.leakyBucket = leakyBucket;}@PostMapping("/api")public ResponseEntity<String> handleRequest(@RequestBody String data) {Request request = new Request(data);if (leakyBucket.tryAddRequest(request)) {return ResponseEntity.ok("请求已接受");} else {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过多,请稍后重试");}}
}
漏桶算法适用性总结
异步限流:漏桶算法的设计初衷是异步处理,适合需要流量整形的场景(如API限流、消息队列消费)。
同步适配:通过阻塞或Future可强制同步,但会牺牲性能,不推荐在高并发场景使用。
替代方案:若需同步限流,可考虑 计数器算法 或 信号量(如Semaphore)。
结合Future模拟同步示例:
public class SyncLeakyBucket {private final BlockingQueue<CompletableFuture<String>> queue = new LinkedBlockingQueue<>(10);private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);public SyncLeakyBucket() {// 每秒处理1个请求scheduler.scheduleAtFixedRate(() -> {CompletableFuture<String> future = queue.poll();if (future != null) {future.complete("处理结果");}}, 0, 1, TimeUnit.SECONDS);}// 同步调用:阻塞等待结果public String processSync(String data) throws InterruptedException, ExecutionException {CompletableFuture<String> future = new CompletableFuture<>();if (queue.offer(future)) {return future.get(); // 阻塞直到结果返回} else {throw new RuntimeException("请求被拒绝");}}
}// 使用示例
SyncLeakyBucket bucket = new SyncLeakyBucket();
String result = bucket.processSync("data"); // 同步阻塞
令牌桶算法(Token Bucket)
令牌桶算法原理
令牌桶算法通过以下机制控制请求速率:
令牌生成:以固定速率(如每秒10个)向桶中添加令牌。
桶容量:桶中最多存储的令牌数(如100个),超出部分丢弃。
请求处理:请求到达时尝试获取令牌,获取成功则处理,否则拒绝。
突发处理:桶内积累的令牌允许一次性消耗,支持突发流量。
实现示例
- 创建令牌桶组件
@Component
public class TokenBucket {private final int capacity; // 桶容量private final int refillRate; // 每秒填充的令牌数private AtomicInteger tokens; // 当前令牌数private long lastRefillTime; // 上次填充时间public TokenBucket(@Value("${token-bucket.capacity:100}") int capacity,@Value("${token-bucket.refill-rate:10}") int refillRate) {this.capacity = capacity;this.refillRate = refillRate;this.tokens = new AtomicInteger(capacity);this.lastRefillTime = System.currentTimeMillis();}// 尝试获取令牌public boolean tryAcquire() {refillTokens(); // 先补充令牌while (true) {int current = tokens.get();if (current <= 0) {return false;}if (tokens.compareAndSet(current, current - 1)) {return true;}}}// 补充令牌(线程安全)private synchronized void refillTokens() {long now = System.currentTimeMillis();long elapsedTime = now - lastRefillTime;int tokensToAdd = (int) (elapsedTime * refillRate / 1000);if (tokensToAdd > 0) {tokens.set(Math.min(tokens.get() + tokensToAdd, capacity));lastRefillTime = now;}}
}
- controller
@RestController
public class ApiController {private final TokenBucket tokenBucket;public ApiController(TokenBucket tokenBucket) {this.tokenBucket = tokenBucket;}@GetMapping("/api")public ResponseEntity<String> handleRequest() {if (tokenBucket.tryAcquire()) {return ResponseEntity.ok("请求处理成功");} else {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过多,请稍后重试");}}
}
令牌桶算法 vs 漏桶算法
令牌桶通过以下方式支持突发流量:
令牌积累:当请求较少时,未使用的令牌会在桶中积累(最多达到桶容量)。
突发消耗:当突发请求到达时,可一次性消耗所有积累的令牌,处理多个请求。
常见限流实现
Guava 的 RateLimiter(单机限流)
基于令牌桶算法,适合单机限流。
优点:简单易用,适合单机场景。
缺点:不支持分布式环境。
- 添加依赖
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version>
</dependency>
- 在Controller中使用RateLimiter:
import com.google.common.util.concurrent.RateLimiter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {// 每秒允许2个请求private final RateLimiter rateLimiter = RateLimiter.create(2.0);@GetMapping("/api/resource")public String getResource() {if (rateLimiter.tryAcquire()) { // 尝试获取令牌return "Success";} else {return "Too many requests!";}}
}
基于 AOP + 自定义注解(单机限流)
通过AOP拦截方法调用,实现限流逻辑。
优点:灵活,可自定义限流规则。
缺点:单机限流,计数器未持久化。
- 定义限流注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimit {int value(); // 允许的请求数int timeWindow() default 60; // 时间窗口(秒)
}
- aop切面
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class RateLimitAspect {private final ConcurrentHashMap<String, AtomicInteger> counters = new ConcurrentHashMap<>();private final ConcurrentHashMap<String, Long> timestamps = new ConcurrentHashMap<>();@Around("@annotation(rateLimit)")public Object limit(ProceedingJoinPoint pjp, RateLimit rateLimit) throws Throwable {String key = pjp.getSignature().toLongString();int limit = rateLimit.value();long window = rateLimit.timeWindow() * 1000L;long now = System.currentTimeMillis();synchronized (this) {if (timestamps.getOrDefault(key, 0L) < now - window) {counters.put(key, new AtomicInteger(0));timestamps.put(key, now);}AtomicInteger count = counters.get(key);if (count != null && count.incrementAndGet() > limit) {throw new RuntimeException("Rate limit exceeded");}}return pjp.proceed();}
}
- Controller
@RateLimit(value = 10, timeWindow = 60) // 60秒内允许10次请求
@GetMapping("/limited-api")
public String limitedApi() {return "Processed";
}
Redis + Lua 脚本(分布式限流)
利用Redis的原子性操作实现分布式限流。
优点:支持分布式环境,高并发安全。
缺点:依赖Redis,需要维护脚本。
固定窗口计数器示例:
- redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- Lua脚本 rate_limiter.lua
-- KEYS[1] = 限流键, ARGV[1] = 窗口时间(秒), ARGV[2] = 最大请求数
local key = KEYS[1]
local window = tonumber(ARGV[1])
local limit = tonumber(ARGV[2])local current = redis.call('GET', key)
if current and tonumber(current) >= limit thenreturn 0 -- 超过阈值,拒绝请求
elseredis.call('INCR', key)if tonumber(current) == 0 then -- 首次设置过期时间redis.call('EXPIRE', key, window)endreturn 1 -- 允许请求
end
- 在Service中调用Lua脚本
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Service;
import java.util.Collections;@Service
public class RateLimitService {private final RedisTemplate<String, String> redisTemplate;private final RedisScript<Long> rateLimiterScript;public RateLimitService(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;this.rateLimiterScript = RedisScript.of(new ClassPathResource("rate_limiter.lua"), Long.class);}public boolean allowRequest(String key, int limit, int windowSec) {Long result = redisTemplate.execute(rateLimiterScript,Collections.singletonList(key), // 限流键 列表 String.valueOf(windowSec) // ARGV 参数String.valueOf(limit) // ARGV 参数);return result != null && result == 1;}
}
- Controller
@GetMapping("/distributed-api")
public String distributedApi() {String key = "user:123:api"; // 根据用户或接口生成唯一keyif (rateLimitService.allowRequest(key, 60, 100)) {return "Success";} else {return "Too many requests!";}
}
使用 Sentinel(生产级方案)
通过阿里开源的Sentinel实现流量控制、熔断降级。
优点:功能强大,支持动态规则配置。
缺点:需要额外部署控制台。
- 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.0.5.0</version>
</dependency>
- 配置资源点
@GetMapping("/sentinel-api")
@SentinelResource(value = "sentinelApi", blockHandler = "blockHandler")
public String sentinelApi() {return "Success";
}public String blockHandler(BlockException ex) {return "Blocked by Sentinel";
}
- 在Sentinel控制台配置规则(QPS=2)
// 代码初始化规则(可选)
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("sentinelApi");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(2);
rules.add(rule);
FlowRuleManager.loadRules(rules);
Spring Cloud Gateway 限流(网关层限流)
适用于微服务架构,在网关层统一限流。
优点:网关层统一管控,适合微服务。
缺点:需部署网关和Redis。
- 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
- 配置路由规则(application.yml)
spring:cloud:gateway:routes:- id: my_routeuri: http://localhost:8080predicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1 # 每秒1个令牌redis-rate-limiter.burstCapacity: 2 # 桶容量key-resolver: "#{@userKeyResolver}"
- 定义KeyResolver(按用户限流)
@Bean
public KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
相关文章:
SpringBoot默认并发处理(Tomcat)、项目限流详解
SpringBoot默认并发处理 在 Spring Boot 项目中,默认情况下,同一时间能处理的请求数由内嵌的 Tomcat 服务器的线程池配置决定。 默认并发处理能力 请求处理流程 请求到达:新请求首先进入 TCP 连接队列(最大 ma…...
Xterminal(或 X Terminal)通常指一类现代化的终端工具 工具介绍
Xterminal(或 X Terminal)通常指一类现代化的终端工具,旨在为开发者、运维人员提供更高效、更智能的命令行操作体验。 📢提示:文章排版原因,资源链接地址放在文章结尾👇👇ÿ…...
如何把win10 wsl的安装目录从c盘迁移到d盘
标题:如何把win10 wsl的安装目录从c盘迁移到d盘 通过microsoft store安装的 wsl 目录默认在 C:\Users[用户名]\AppData\Local\wsl 下 wsl的docker镜像以及dify的编译环境会占用大量硬盘空间,0.15.3 、1.1.3、1.3.1 三个版本的环境占用空间超过40GB [图…...
2025医疗信息化趋势:健康管理系统如何重构智慧医院生态
当北京协和医院的门诊大厅启用智能分诊机器人时,距离其3000公里外的三甲医院正通过健康管理系统将慢性病复诊率降低42%。这场静默发生的医疗革命,正在重新定义2025年智慧医院的建设标准。 一、穿透数据孤岛的三大核心引擎 最新版《智慧医院评价指标体系…...
java volatile关键字
volatile 是 Java 中用于保证多线程环境下变量可见性和禁止指令重排序的关键字。 普通变量不加volatile修饰有可见性问题,即有线程修改该变量值,其他线程无法立即感知该变量值修改了。代码: private static int intVal 0; // 普通变量未加 …...
中阳策略模型:结构节奏中的方向感知逻辑
中阳策略模型:结构节奏中的方向感知逻辑 在交易世界中,“节奏”与“结构”的互动远比大多数人想象得复杂。中阳研究团队在大量实战数据分析中提出一个核心观点:方向感的建立,必须以结构驱动为前提,以节奏确认为依据。 …...
死锁的形成
死锁的形成 背景学习资源死锁的本质 背景 面试可能会被问到. 学习资源 一个案例: https://www.bilibili.com/video/BV1pz421Y7kM 死锁的本质 互相持有对方的资源. 存在资源竞争都没有释放. 可能出现死锁. insert into demo_user (no, name) values (6, ‘test1’) on dupl…...
每天五分钟深度学习框架pytorch:视觉工具包torchvison
本文重点 在pytorch深度学习框架中,torchvision是一个非常优秀的视觉工具包,我们可以使用它加载一些著名的数据集,然后我们可以使用它来加载网络模型,比如vgg,resnet等等,还可以使用它来预处理一些图片数据,本节课程我们将学习一下它的使用方式。 torchvision的四部分…...
C++之运算符重载实例(日期类实现)
日期类实现 C 日期类的实现与深度解析一、代码结构概览1.1 头文件 Date.h1.2 源文件 Date.cpp 二、关键函数实现解析2.1 获取某月天数函数 GetMonthDay2.2 构造函数 Date2.3 日期加减法运算2.4 前置与后置自增/自减操作2.5 日期比较与差值计算 三、代码优化与注意事项3.1 代码优…...
数据分析怎么做?高效的数据分析方法有哪些?
目录 一、数据分析的对象和目的 (一)数据分析的常见对象 (二)数据分析的目的 二、数据分析怎么做? (一)明确问题 (二)收集数据 (三)清洗和…...
数组和切片的区别
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
【Linux】自定义shell的编写
📝前言: 这篇文章我们来讲讲【Linux】简单自定义shell的编写,通过这个简单的模拟实现,进一步感受shell的工作原理。 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页…...
【C/C++】为什么要noexcept
为什么要noexcept 在C中,noexcept修饰符用于指示函数不会抛出异常 1. 性能优化 减少异常处理开销:编译器在生成代码时,若函数标记为noexcept,可以省略异常处理的相关机制(如栈展开代码),从而减…...
运用fmpeg写一个背英文单词的demo带翻译
-男生会因为不配而离开那个深爱的她吗?? 一, fmpeg-7.0.1 是做什么用的?? FFmpeg 7.0.1 是 FFmpeg 的一个版本,FFmpeg 是一个开源的多媒体框架,用于处理音视频数据。FFmpeg 提供了强大的工具和…...
Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
文章目录 前言解决方案gradlemaven 仓库 前言 我们在Android 开发的过程中,经常会遇到三方依赖下载不下来的问题。一般情况下我们会在项目的build.gradle文件中配置多个 maven 仓库来解决。 // Top-level build file where you can add configuration options com…...
vue3: pdf.js5.2.133 using typescript
npm install pdfjs-dist5.2.133 项目结构: <!--* creater: geovindu* since: 2025-05-09 21:56:20* LastAuthor: geovindu* lastTime: 2025-05-09 22:12:17* 文件相对于项目的路径: \jsstudy\vuepdfpreview\comonents\pdfjs.vue* message: geovindu* IDE: vscod…...
doxygen 生成 html 网页的一个简单步骤
假设项目源码目录是 src 那么在 src 上一级运行: doxygen -g生成 Doxyfile 随后配置 Doxyfile # 项目相关配置 PROJECT_NAME "你的项目名称" PROJECT_NUMBER "1.0" PROJECT_BRIEF "项目简短描述" …...
云原生环境下服务治理体系的构建与落地实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:服务治理正在从“框架能力”向“平台能力”演进 随着微服务架构逐步成熟,越来越多的企业开始向云原生迁移,Kubernetes、Service Mesh、Serverless 等新兴技术不断推动系统的基础设施演进。 与…...
vue 监听元素大小变化 element-resize-detector
1,安装 npm install element-resize-detector --save2、设置成全局插件 element-resize-detector.js: import ElementResizeDetectorMaker from element-resize-detectorexport default {install: function(Vue, name $erd) {Vue.prototype[name] …...
智芯Z20K144x MCU开发之时钟架构
这里写目录标题 一、zhixin时钟架构1.时钟源2.系统时钟控制器(SCC)3.外设时钟控制器(PARCC) 二、软件应用三、总结 一、zhixin时钟架构 可以将时钟架构分解为三个部分来理解: 时钟源(OSC、FIRC、LPO&#…...
levelDB的数据查看(非常详细)
起因:.net大作业天气预报程序(WPF)答辩时,老师问怎么维持数据持久性的,启动时加载的数据存在哪里,我明白老师想考的应该是json文件的解析(正反),半天没答上来存那个文件了(老师默认这个文件是自…...
OpenHarmony平台驱动开发(十),MMC
OpenHarmony平台驱动开发(十) MMC 概述 功能简介 MMC(MultiMedia Card)即多媒体卡,是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定(一种卡式)࿰…...
【Go底层】http标准库服务端实现原理
目录 1、背景2、核心数据结构【1】Server对象【2】Handler对象【3】ServeMux对象 3、服务端代码示例4、路由注册5、路由匹配 1、背景 http协议的交互框架是C-S架构,C对应客户端模块,S对应服务端模块,接下来我们就基于Go1.23源码来熟悉http标…...
现代健康养生新主张
在充满挑战与压力的现代生活中,健康养生已成为提升生活品质的关键。无需复杂的理论与传统养生模式,通过践行以下科学方法,便能轻松拥抱健康生活。 压力管理是现代养生的核心。长期高压力状态会引发激素失衡、免疫力下降等问题。尝试每天进…...
Spring 必会之微服务篇(1)
目录 引入 单体架构 集群和分布式架构 微服务架构 挑战 Spring Cloud 介绍 实现方案 Spring Cloud Alibaba 引入 单体架构 当我们刚开始学开发的时候,基本都是单体架构,就是把一个项目的所有业务的实现功能都打包在一个 war 包或者 Jar 包中。…...
创始人 IP 的破局之道:从技术突围到生态重构的时代启示|创客匠人评述
在 2025 年的商业版图上,创始人 IP 正以前所未有的深度介入产业变革。当奥雅股份联合创始人李方悦在 “中国上市公司品牌价值榜” 发布会上,将 IP 赋能与城市更新大模型结合时,当马斯克在特斯拉财报电话会议上宣称 “未来属于自动驾驶和人形机…...
C++ stl中的stack和queue的相关函数用法
文章目录 stackstack的定义stack的使用 queuequeue的定义queue的使用 stack的使用 包含头文件< stack > #include <stack>queue的使用 包含头文件< queue > #include <queue>stack stack是一种容器适配器,用于具有后进先出操作的场景中&…...
Navicat BI 数据分析功能上线 | 数据洞察新方法
Navicat 17.2 版本一经发布,便以 AI 助手赋能智能交互、Snowflake 支持拓展数据连接版图、拓展对关系型、维度以及数据仓库 2.0 建模方法的支持等新特性与功能抓住了用户的目光,但其中一项低调且实用的更新 - 在 BI 数据预览中深度集成数据分析工具&…...
【网络编程】四、守护进程实现 前后台作业 会话与进程组
文章目录 Ⅰ. 守护进程的概念Ⅱ. 理解会话和作业🎏 会话和进程组的特性小总结Ⅳ. 作业的前后台转换1、fg 指令2、bg 指令 Ⅴ. 守护进程实现1、常见接口① 创建守护进程 -- daemon② 自成会话函数 -- setsid③ 获取会话ID函数 -- getsid 2、自主实现守护进程函数 Ⅰ.…...
【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
一、智能追焦技术概述 智能追焦是基于人工智能和自动化技术的对焦功能,通过深度学习算法识别并持续跟踪移动物体(如人、动物、运动器械等),实时调整焦距以保持主体清晰,显著提升动态场景拍摄成功率。其核心优势包括: 精准性:AI 算法优化复杂运动轨迹追踪(如不规则移动…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.3 商品销售预测模型
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 9.3 商品销售预测模型9.3.1 数据清洗与特征工程9.3.1.1 数据清洗流程1. 缺失值处理2. 异常值检测3. 数据一致性校验 9.3.1.2 特征工程实现1. 时间特征提取2. 用户行为特征3.…...
Docker容器启动失败?无法启动?
Docker容器无法启动的疑难杂症解析与解决方案 一、问题现象 Docker容器无法启动是开发者在容器化部署中最常见的故障之一。尽管Docker提供了丰富的调试工具,但问题的根源往往隐藏在复杂的配置、环境依赖或资源限制中。本文将从环境变量配置错误这一细节问题入手&am…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.4 可视化报告输出
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 电商数据分析实战:基于PostgreSQL的可视化报告生成全流程9.4 可视化报告输出9.4.1 可视化报告设计框架9.4.1.1 报告目标与受众9.4.1.2 数据准备与指标体系 9.4.2…...
字符串---Spring字符串基本处理
一、String类的特性 不可变性 String对象一旦创建,内容不可更改,任何修改操作都会生成新对象。字符串常量池 字符串字面量(如"abc")直接存储在常量池中,重复字面量共享同一内存地址。创建方式 虽然都是字符…...
车载以太网转USB接口工具选型指南(2025版)
一、车载以太网转USB接口工具的核心需求 在新能源汽车研发中,车载以太网与USB接口的转换工具需满足以下核心需求: 物理层兼容性:支持100BASE-T1/1000BASE-T1车载以太网标准,适应车内EMC环境。协议解析能力:支持SOME/…...
Docker基础入门:容器化技术详解
Docker基础入门:容器化技术详解 1. Docker简介 Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个可移植的容器中,从而确保应用在不同环境中的一致运行。Docker于2013年发布,迅速成为软件开发领域的革命性工具…...
SQL注入的绕过方式
1.注释与空白符绕过 利用#,--,/**/替代被过滤的注释符 利用%09(Tab),%0A(换行) ,/**/代替空格:如union%0Aselect%0A1,2,3 2.编码绕过: URL编码,双重编码,十六进制编码,Unicode编…...
Java 23种设计模式 - 结构型模式7种
Java 23种设计模式 - 结构型模式7种 1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 优点 将目标类和适配者类解耦增加了类的透明性和复用性,将具体的实现封…...
Linux快速入门
Linux概述 Linux系统版本 Linux系统分为内核版和发行版 内核版 由Linux核心团队开发、维护 免费、开源 负责控制硬件 发行版 基于Linux内核版进行扩展 由各个Linux厂商开发、维护 有收费版本和免费版本 Linux系统发行版: Ubuntu:以桌面应用为主,免费 …...
了解Hadoop
Hadoop了解 Hadoop 是 Apache 基金会开发的一个开源分布式计算平台,主要用于存储和处理大规模数据集。 它能让用户在不了解分布式系统底层细节的情况下,轻松进行分布式程序的开发,将应用程序自动部署到由大量普通机器组成的集群上进行高效运…...
FPGA:如何提高RTL编码能力?
要提升RTL(寄存器传输级)编码能力,需从硬件设计思维建立、典型电路建模、编码规范掌握、工具链应用和工程实践五个维度系统性训练。以下是具体提升路径: 一、建立硬件设计思维:理解RTL与软件的本质区别 RTL代码最终会…...
高频微服务面试题总结
微服务基础概念 什么是微服务架构? 将单一应用拆分为一组小型服务每个服务运行独立进程,轻量级通信独立开发、部署和扩展特点:松耦合、独立技术栈、独立数据库微服务与单体架构对比 维度单体架构微服务架构开发效率初期快初期慢部署整体部署独立部署扩展性整体扩展细粒度扩展…...
【RAG】Milvus、Pinecone、PgVector向量数据库索引参数优化
Milvus 、PgVector 索引参数优化 IVF类索引关键参数(基于聚类算法) nlist (倒排列表数量): 决定将向量空间划分为多少个聚类中心值越大搜索越精确但耗时越长推荐值: 通常设置为数据量的4√n到n/1000之间例如: 1百万数据量可设nlist1000到4000 nprobe (…...
基金基础知识-指数基金 | 投资理财(4) 【待续】
基金通常是由股票、债券等多种资产组合而成的投资工具,核心是分散化,将资金投向一篮子资产(动态),避免单一资产的风险。 按投资标的分类: 基金类型 相当于 特点 适合人群 货币基金 活期钱包&…...
【K8S系列】Kubernetes常用 命令
以下为的 Kubernetes 超全常用命令文档,涵盖集群管理、资源操作、调试排错等核心场景,结合示例与解析, 高效运维 Kubernetes 环境。 一、集群与节点管理 1. 集群信息查看 查看集群基本信息kubectl cluster-info # 显示API Server、DNS等核…...
高性能编程相关
常见高性能编程技巧: 一,系统级性能优化:从系统架构设计考虑,例如消息队列,模块分成分级,IO读写带宽等 二,算法级性能优化:时间和空间优化 三,代码级性能优…...
使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…...
k8s之statefulset
什么是statefulset(sts) statefulset是用来管理有状态应用的工作负载API对象,也是一种工作负载资源 有状态和无状态 无状态应用:当前应用不会记录状态(网络可能会变、挂载的东西可能会变、顺序可能会变) 有状态应用:需要记录当前状态(网络不变、存储不变、顺序不变) 使…...
在自然语言处理任务中,像 BERT 这样的模型会在输入前自动加上一些特殊token
🌱 1. 什么是 BERT? BERT 是一个自然语言理解模型。你可以把它想象成一个超级聪明的“语言理解机器人”。你把一句话丢进去,它能: 理解这句话的意思;告诉你哪个词是实体(人名、地名)ÿ…...
java学习笔记
Java 方法返回值 Java 是一种强类型语言,方法在定义时必须明确指定返回值的类型。 这确保了类型安全和代码的可预测性. 方法返回值不能缺省。 必须显式声明返回类型. 如果方法没有返回值,需要使用 void 关键字来表示。 void 意味着该方法执行某些操作但不返回任何值。 访问修…...