设计一个高性能的分布式限流系统
设计一个高性能的分布式限流系统
在现代分布式系统中,流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化,系统往往需要面对突发流量或恶意攻击等场景,这就对限流机制提出了更高的要求。一套高性能的分布式限流系统,不仅能够精准控制流量,防止系统过载,还需要在高并发场景下具备低延迟、高吞吐的能力,同时满足多样化的业务需求。

从需求出发,我们需要明确限流的目标,例如按用户、接口或IP维度限制访问频率,确保系统资源的公平使用。其次,选择合适的限流算法至关重要,例如固定窗口计数、滑动窗口、令牌桶或漏桶算法,它们各有优缺点,需要结合业务场景选择合适的方案。同时,分布式场景中的限流不同于单机限流,需要应对多节点协同的问题,这就涉及到分布式存储和一致性方案的设计,比如借助 Redis 或 ZooKeeper 实现全局限流。
需求分析
设计一个高性能的分布式限流系统,需求分析是关键的起点,它直接决定了系统的功能范围、实现方案以及性能要求。

1. 限流目标
- 保护系统稳定性:避免突发流量(如流量洪峰或恶意攻击)导致系统过载、服务不可用。
- 优化资源利用:通过限流保证公平分配资源,避免某些用户或接口占用过多系统资源。
- 提升用户体验:在限流情况下,提供平滑的降级策略,防止用户体验断崖式下滑。
2. 应用场景
- 接口调用限制:对特定接口的访问频率进行限制,如限制每秒的请求数。
- 用户行为控制:按用户ID、IP等维度限制访问频率,防止恶意用户滥用服务。
- 业务场景保护:对热点商品抢购、秒杀活动等场景进行限流,确保核心业务的稳定运行。
- 分布式服务协调:在多服务协作的场景下,进行全局限流,避免某个服务成为瓶颈。
3. 限流粒度
- 全局限流:针对系统整体进行流量控制,防止某一类请求占用全部资源。
- 单服务限流:针对单一服务或接口进行限流,避免资源争夺。
- 细粒度限流:按用户ID、IP、会话或业务标签设置限流规则,实现个性化限制。
4. 性能要求
- 高并发支持:在高流量场景下,限流系统需要能够承载数万甚至数十万的并发请求。
- 低延迟响应:限流判断需要快速完成,避免成为系统瓶颈。
- 扩展性强:系统需要支持动态扩容,适应流量变化。
5. 功能需求
- 动态规则配置:限流策略需要支持动态调整,以应对业务变化。
- 实时监控:需要对限流效果进行可视化展示,提供流量统计、限流次数、超限情况等数据。
- 支持多种算法:根据业务场景选择固定窗口、滑动窗口、令牌桶、漏桶等限流算法。
- 分布式协同:支持跨节点的流量控制,保证多节点环境下一致性的限流行为。
6. 可靠性和容错性
- 限流数据持久化:对于需要长期跟踪的数据(如用户行为记录),支持可靠存储。
- 故障隔离:限流系统本身不能成为系统的单点故障,需要具备高可用性。
- 降级策略:当限流系统发生异常时,应提供降级模式,确保核心服务运行。
7. 可扩展性
- 多租户支持:允许为不同的业务或用户群体设置独立的限流策略。
- 高并发扩展:系统需要能够通过增加节点或资源来支持更高的并发需求。
- 规则多样性:支持组合限流规则,如同时对用户、IP、接口进行多维度限制。
限流算法选择
限流算法是分布式限流系统的核心,它直接决定了限流的精准性、性能以及适用场景。选择合适的限流算法需要根据业务需求、系统负载特性和性能指标综合考虑。

1. 固定时间窗口算法
- 原理:将时间划分为固定的窗口(如1秒、1分钟),统计窗口内的请求数。如果超过限流阈值,直接拒绝超出的请求。
- 优点:实现简单,适用于大多数限流场景。请求统计只在当前时间窗口内,内存占用小。
- 缺点:存在突发流量问题:在两个窗口的交界点可能会有瞬时流量激增。
- 适用场景:接口调用频率控制,如每秒允许最多100次调用。
- 实现难点:如何高效处理窗口边界的请求统计,避免出现数据竞争。
2. 滑动时间窗口算法
- 原理:与固定时间窗口类似,但通过在固定时间内动态统计请求数量实现更平滑的限流效果。统计时间窗口是“滑动”的,不会因窗口边界导致瞬时突发。
- 优点:更精准的限流,无突发流量问题。对流量平滑的控制效果更好。
- 缺点:实现复杂,需要对时间窗口内的请求进行动态统计(如基于环形数组或时间分片)。内存和计算资源占用较高。
- 适用场景:高并发场景下对流量平稳性的要求较高的接口。
- 实现难点:如何实现高效的时间窗口滑动统计,避免引入性能瓶颈。
3. 令牌桶算法
- 原理:系统以固定速率向令牌桶中添加令牌,请求只有在获取到令牌时才被允许通过。令牌桶容量限制了可处理的突发流量。
- 优点:支持突发流量:在突发情况下允许短时间内消耗桶中累积的令牌。易于实现平滑的限流控制。
- 缺点:需要额外的机制来处理令牌的生成和分发。
- 适用场景:支持短时间突发请求的业务场景,例如电商促销接口、抢购系统。
- 实现难点:在分布式场景中,需要一致性的令牌分发机制。如何动态调整令牌生成速率以应对流量变化。
4. 漏桶算法
- 原理:请求被以固定速率处理,不允许突发流量超过预设容量(桶的大小)。请求按顺序进入“漏桶”,多余的请求被丢弃。
- 优点:保证流量的稳定输出,适合对下游系统有固定流量要求的场景。易于实现流量整形,避免突发对下游系统的冲击。
- 缺点:不支持突发流量,即使桶内有空间,请求仍需要等待固定速率处理。
- 适用场景:严格限制流量的场景,如第三方服务调用、带宽限制等。
- 实现难点:需要精确的计时器或调度器来控制漏桶的出水速率。
5. 基于计数器的限流
- 原理:通过简单的计数器记录单位时间内的请求数,超出阈值后拒绝请求。
- 优点:实现简单,性能高,适合轻量级限流。
- 缺点:存在临界问题:如在单位时间的边界处突发流量仍可能超过设定值。
- 适用场景:小型系统或流量模式较为稳定的场景。
- 实现难点:如何精确统计请求数,避免计数器竞争。
6. 动态限流算法
- 原理:结合实时监控与机器学习,动态调整限流规则,适应流量变化。
- 优点:自动化限流策略优化,避免人为干预。更精准的流量预测和控制。
- 缺点:实现复杂,需要依赖数据分析和实时反馈。
- 适用场景:复杂业务场景和高动态负载环境,如在线游戏、直播平台。
- 实现难点:需要可靠的实时数据采集和预测模型。如何快速调整限流策略以避免滞后影响。
7. 分布式限流算法
- 原理:将限流逻辑分布到多节点,通过集中协调(如基于Redis、ZooKeeper、Consul)或去中心化方式实现全局限流。
- 优点:支持高并发和高可用,适用于分布式系统。
- 缺点:需要解决分布式环境中的一致性和性能问题。
- 适用场景:多机房、跨地域的分布式微服务场景。
- 实现难点:如何在节点间同步限流状态,降低网络开销和一致性问题。
选择算法的关键因素
- 流量特性:如是否存在突发流量、请求的分布特性。
- 业务优先级:是否需要动态调整限流规则或根据业务维度限流。
- 实现复杂度:考虑实现的难度和对系统性能的影响。
- 分布式需求:是否需要全局限流及一致性。
分布式架构设计
设计一个高性能的分布式限流系统,需要从分布式架构的特点出发,解决限流过程中遇到的高并发、数据一致性、低延迟等问题。
1. 分布式限流的核心需求
- 全局限流:在分布式环境中对整个系统的请求进行统一限流控制。
- 节点级限流:对单个服务节点进行流量控制,避免单点过载。
- 动态配置:支持限流规则的实时变更,无需重启服务。
- 高可用性:系统在部分节点故障时仍能稳定运行。
- 低延迟:限流逻辑不能成为高并发系统的性能瓶颈。
2. 分布式限流的架构设计原则
- 去中心化:限流逻辑尽量分布到各服务节点,减少集中式瓶颈。
- 一致性:确保分布式系统中节点共享的限流信息同步一致。
- 高扩展性:支持动态添加或移除节点,系统性能随之扩展。
- 容错性:即使某些节点失败,限流机制依然可以发挥作用。
- 幂等性:限流请求重复处理时,结果保持一致。
3. 分布式限流的关键技术
- 分布式存储
-
- Redis:使用Redis作为共享存储实现限流的计数器。
-
-
- 实现:Lua脚本保证限流操作的原子性。
- 优势:性能高,支持数据持久化。
- 缺点:单点Redis可能成为瓶颈,需设计分布式部署。
-
-
- Consul/Nacos:通过KV存储共享限流规则。
- 一致性协议
-
- Paxos/Raft:用于分布式节点间的状态同步,保证限流策略的一致性。
- Redis Cluster:分布式Redis集群保证高可用与一致性。
- 分布式锁
利用分布式锁(如基于Redisson)对共享资源进行保护,避免多个节点重复计算限流逻辑。
- 消息队列
使用Kafka或RabbitMQ控制流量,消息队列天然具有削峰限流的特性。
-
- 适合异步流量限流场景,避免高并发直接冲击核心服务。
- API 网关
在网关层(如Spring Cloud Gateway、Nginx)设置限流规则,对外部请求进行预处理,减少后端压力。
- 缓存与本地计数
-
- 在服务节点中结合本地计数器(如Guava RateLimiter)与分布式缓存。
- 优势:降低分布式存储的请求频率。
- 缺点:需解决本地计数器与全局计数器的一致性问题。
- 动态配置管理
使用配置中心(如Apollo、Nacos)实现限流规则的动态下发和更新,结合实时监听机制(如WebSocket、长轮询)使配置变更无缝生效。
4. 限流架构的核心模块
- 规则管理模块
提供限流规则的配置、存储和动态更新。支持按API、用户、IP、时间窗等维度设置规则。
- 流量监控模块
实时统计请求量、平均响应时间、失败率等指标。提供仪表盘监控,方便运维人员查看限流效果。
- 限流决策模块
根据规则判断请求是否被允许。提供快速判定逻辑,避免高并发场景下的性能瓶颈。
- 存储与同步模块
共享计数器的存储(如Redis)和限流策略的分发(如MQ或配置中心)。确保数据一致性和系统扩展性。
- 降级与告警模块
超出限流阈值时触发降级逻辑,如返回错误提示、限速或排队机制。异常流量触发告警,通知运维及时干预。
5. 典型的分布式限流架构实现
- 集中式限流
-
- 所有流量先经过网关或集中限流服务。
- 优点:便于管理和维护,限流规则统一。
- 缺点:集中式服务可能成为性能瓶颈和单点故障。
- 分布式限流
-
- 各节点独立执行限流逻辑,利用分布式存储同步状态。
- 优点:高可用、低延迟。
- 缺点:实现复杂,需解决节点间一致性问题。
- 混合式限流
网关层负责全局限流,服务节点负责局部限流。综合利用集中式和分布式的优势。
6. 常见的优化策略
- 局部限流优先
请求优先在本地节点执行限流逻辑,减少分布式存储访问压力。使用本地缓存或计数器结合布隆过滤器过滤无效流量。
- 流量预估
对历史流量数据进行建模,预测未来流量峰值,动态调整限流阈值。
- 层级限流
在网关、应用服务、数据库等不同层级分别设置限流规则,避免流量集中在某一层。
- 熔断与降级
限流规则触发后,快速熔断异常请求,并提供降级服务,避免整体服务被拖垮。
- 削峰填谷
通过队列缓冲高峰流量,延迟处理请求。
核心技术选型
在设计高性能分布式限流系统时,核心技术选型直接影响系统的性能、可用性和复杂度。技术选型需要结合业务需求、流量规模以及团队技术栈。
1. 存储层选型
- Redis
-
- 适用场景:高并发流量计数器、全局限流状态存储。
- 优势:
-
-
- 高性能,支持百万级QPS。
- Lua脚本可以实现计数器的原子性操作。
- 分布式支持(Redis Cluster)保证高可用性和扩展性。
-
-
- 劣势:
-
-
- Redis单实例易成为瓶颈,需搭建分布式集群。
- 对超高并发场景下的写入压力需结合本地缓存优化。
-
- MongoDB/Cassandra
-
- 适用场景:大规模规则存储或需要历史请求记录的场景。
- 优势:支持分布式存储和查询,扩展性强。
- 劣势:性能相对Redis较低,适合规则配置存储而非实时计数。
- 内存型数据库
-
- 如Aerospike、Memcached。
- 适用场景:低延迟请求限流。
- 优势:更低的访问延迟。
- 劣势:功能不如Redis丰富,生态较小。
- 分布式文件系统
-
- 如HDFS。
- 适用场景:批量限流记录存储(不适合实时限流)。
- 优势:适合大数据场景。
- 劣势:高延迟,不适合实时性要求高的限流。
2. 限流算法选型
- 固定窗口算法
-
- 简单易实现,适用于低并发或流量较均匀的场景。
- 缺点:可能产生“临界突发”。
- 滑动窗口算法
-
- 优势:流量统计更平滑,适用于高并发业务。
- 实现:结合Redis或本地缓存存储时间窗口内的请求数据。
- 令牌桶算法
-
- 优势:控制流量速率,支持流量突发。
- 实现:本地计数+分布式同步,或基于Redis的Lua脚本。
- 漏桶算法
-
- 优势:平滑请求流量,适用于流量稳定的场景。
- 实现:在服务端队列中模拟漏桶逻辑。
- 混合算法
-
- 应用场景:不同层级的限流需求。
- 实现:结合滑动窗口统计+令牌桶速率控制。
3. 通信与同步选型
- 配置中心
-
- 技术选型:Nacos、Apollo、Consul。
- 适用场景:限流规则的动态下发与更新。
- 优势:支持动态刷新、分布式管理。
- 实现:
-
-
- 配置中心存储限流规则。
- 服务节点实时监听配置变更并同步应用。
-
- 分布式一致性协议
-
- 技术选型:Raft、Paxos、Zookeeper。
- 适用场景:限流计数器的分布式同步。
- 优势:数据一致性高。
- 劣势:增加同步延迟,不适用于极高并发的实时限流场景。
- 消息队列
-
- 技术选型:Kafka、RabbitMQ、RocketMQ。
- 适用场景:流量削峰填谷,异步限流。
- 优势:
-
-
- 高效缓冲流量。
- 可扩展性强,支持高并发。
-
-
- 劣势:适用于异步场景,不适合对响应时间要求高的同步限流。
4. 网关选型
- Spring Cloud Gateway
-
- 适用场景:基于Spring生态的微服务限流。
- 优势:与Spring生态无缝集成,支持动态路由和内置限流。
- 劣势:性能不如专用网关。
- Nginx
-
- 适用场景:流量入口的全局限流。
- 优势:成熟高效,支持Lua扩展实现自定义限流。
- 劣势:复杂限流逻辑需要结合后端实现。
- Envoy
-
- 适用场景:Service Mesh中实现流量控制。
- 优势:轻量、高性能,支持分布式限流策略。
- 劣势:配置和调试复杂度高。
- API Gateway 服务
-
- 技术选型:AWS API Gateway、Kong。
- 适用场景:云原生架构中统一的限流与流量控制。
- 优势:开箱即用的限流功能。
- 劣势:与自定义业务逻辑的集成能力有限。
5. 本地优化技术选型
- 缓存技术
-
- 技术选型:Guava Cache、Caffeine。
- 适用场景:减少分布式存储的频繁访问。
- 优势:本地限流性能高,延迟低。
- 实现:
-
-
- 本地计数器结合布隆过滤器,过滤大部分无效流量。
- 配合全局限流计数,解决数据一致性问题。
-
- 线程池管理
-
- 技术选型:Java自带的线程池、Disruptor。
- 适用场景:流量整形、异步处理。
- 优势:提高吞吐量,避免服务崩溃。
- 实现:为每个请求分配线程池,动态调整线程池大小。
6. 监控与日志技术选型
- 实时监控
-
- 技术选型:Prometheus + Grafana。
- 适用场景:实时查看限流效果和流量状态。
- 优势:实时性强,支持多维度数据展示。
- 实现:将限流数据通过Exporter暴露给Prometheus。
- 分布式链路跟踪
-
- 技术选型:SkyWalking、Zipkin、Jaeger。
- 适用场景:分析限流瓶颈,优化系统性能。
- 优势:清晰的调用链路,快速定位问题。
- 实现:在限流逻辑中埋点,监控关键流程。
- 日志系统
-
- 技术选型:ELK Stack、Fluentd。
- 适用场景:记录限流规则的执行日志。
- 优势:高效存储和检索,便于问题追踪。
系统实现与优化
构建一个高性能分布式限流系统,除了理论设计外,还需要注重实际的系统实现和运行中的性能优化。限流系统不仅要确保流量控制的精准性,还要尽量减少对业务系统性能的影响。
系统实现
- 架构实现
-
- 分层设计:
-
-
- 入口层限流:在网关(如Nginx、Spring Cloud Gateway)中实现全局限流,对流量进行第一层拦截。
- 服务层限流:在具体服务内进行更细粒度的接口或用户级限流。
- 客户端限流:将部分限流逻辑前移到客户端,减少服务端压力(如请求前置校验)。
-
-
- 分布式架构:通过Redis Cluster或分布式数据库存储限流状态,确保多节点间的限流规则一致性。使用分布式锁或一致性协议(如Raft)确保多实例限流逻辑同步。
- 限流规则存储
-
- 动态配置:使用配置中心(如Nacos、Apollo)动态存储限流规则,支持规则实时下发与更新。
- 规则分级:按用户、IP、接口、服务等维度设置多级限流规则。支持静态规则和动态规则(如流量峰值预测调整)。
- 核心限流逻辑
-
- 限流计数器:使用Redis的原子操作(如
INCR和Lua脚本)实现分布式计数器。滑动窗口限流通过将请求时间存储为有序集合,按窗口边界动态计算请求总量。 - 令牌桶算法实现:使用Redis的
GET和SET结合Lua脚本实现令牌生成与消费的原子操作。本地实现令牌桶算法,通过定时任务为桶添加令牌。 - 漏桶算法实现:实现漏桶队列,按照固定速率处理队列中的请求。
- 限流计数器:使用Redis的原子操作(如
- 网关限流
-
- 静态限流:配置固定的限流规则(如Nginx的限流模块、Spring Cloud Gateway的内置限流过滤器)。
- 动态限流:使用网关的自定义过滤器,通过实时监控和配置中心动态调整限流规则。
系统优化
- 性能优化
-
- 缓存机制:使用本地缓存(如Caffeine)减少频繁访问分布式存储。结合布隆过滤器过滤无效请求,减少限流计数器的压力。
- 批量操作:限流计数器的更新采用批量操作(如每秒一次批量写入Redis),降低分布式存储的写操作频率。
- 减少网络通信开销:在本地缓存部分限流状态,优先进行本地校验,减少与分布式存储之间的通信。
- 高可用优化
-
- 分布式存储高可用性:Redis集群启用主从模式与哨兵机制,确保节点故障时自动切换。
- 服务降级与熔断:在限流系统本身发生故障时,启用服务降级逻辑,确保业务系统的核心功能可用。
- 限流规则冗余备份:将重要的限流规则以静态配置备份至各服务节点,在配置中心不可用时启用本地规则。
- 系统弹性扩展
-
- 动态扩展节点:使用容器编排工具(如Kubernetes)自动扩展限流服务节点,平衡流量压力。
- 限流分片:按用户或接口分片,将限流逻辑分布到多个节点,避免单点过载。
- 监控与预警
-
- 实时监控:通过Prometheus采集限流指标(如请求通过率、拒绝率)并在Grafana中可视化。
- 日志分析:使用ELK Stack记录限流日志,分析限流拒绝请求的分布与原因。
- 动态调整:根据监控数据,动态调整限流策略。例如,当流量峰值时,适当放宽限流规则以提高系统吞吐量。
- 用户体验优化
-
- 限流提示:在拒绝请求时返回详细的错误信息(如“请求过多,请稍后再试”),优化用户体验。
- 排队机制:实现请求排队,当请求超出限流阈值但仍在服务容量内时,将请求进入排队队列而非直接拒绝。
优化后的优势
- 高性能:结合本地缓存和分布式存储,确保系统处理海量并发请求的能力。
- 高可用性:通过冗余设计和故障切换机制,避免限流系统成为单点故障。
- 弹性与灵活性:支持动态调整规则和弹性扩展节点,应对流量峰值。
- 可观测性:通过实时监控和日志分析,快速定位性能瓶颈并优化。
想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长
Java技术小馆官网
https://www.yuque.com/jtostring
相关文章:
设计一个高性能的分布式限流系统
设计一个高性能的分布式限流系统 在现代分布式系统中,流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化,系统往往需要面对突发流量或恶意攻击等场景,这就对限流机制提出了更高的要求。一套高性能的…...
[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信
基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯(飞控部分)六.移植2.4g通讯(遥控部分)七.通讯模块的完成(遥控部分) 一.Si24Ri原理图 S…...
【Android】RuntimeShader 应用
1 简介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...
Skia 图形引擎介绍
文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...
jQuery从入门到应用:选择器、DOM与Ajax综合指南
文章目录 前言jQuery对象1、jQuery的使用在需要使用jQuery的页面引入Js文件使用jQuery选择页面元素并获取其文本内容 2、jQuery包装集与Dom对象DOM对象和jQuery对象的选择及互相转换 jQuery对象关键点说明: jQuery选择器1、基础选择器关键点说明 2、层次选择器关键点…...
10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)
1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…...
手搓智能音箱——语音识别及调用大模型回应
一、代码概述 此 Python 代码实现了一个语音交互系统,主要功能为监听唤醒词,在唤醒后接收用户语音问题,利用百度语音识别将语音转换为文本,再调用 DeepSeek API 获取智能回复,最后使用文本转语音功能将回复朗读出来。 …...
Modbus通信协议基础知识总结
1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区,通过存储区代号区分: 输出线圈(0x):可读写,对应二进制开关量(如继电器状态),地址范围000001-065536ÿ…...
vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动
1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...
使用 CryptoJS 实现 AES 解密:动态数据解密示例
在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...
Go语言对于MySQL的基本操作
一.下载依赖 终端中输入: go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…...
AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)
AndroidStudio下载安装,环境部署以及常见问题解决!!! 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …...
开源免费一句话生成儿童故事视频核心思想解析
再看一个演示视频,学会核心思想后,可以打造自己的内容生成工具,后文有基于飞书多维表格的实现效果: 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具,可根据用户输入的主题,快速…...
数据结构——最短路(BFS,Dijkstra,Floyd)
完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型: 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…...
Kali Linux汉化教程:轻松设置中文界面
1.打开终端 2.输入sudo dpkg-reconfigure locales,回车,输入密码,回车 sudo dpkg-reconfigure locales 3.往下滑,滑到底,找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…...
分布式锁: 并发时,redis如何避免删别人的锁
在使用Redis实现分布式锁的时候,如何避免在并发情况下误删别人的锁。首先,分布式锁的基本概念:是多个客户端在访问共享资源时,通过某种机制来确保同一时间只有一个客户端能持有锁。 Redis通常用SET命令加上NX选项来创建锁…...
Leetcode 160 Intersection of Two Linked Lists
题意 给定两个链表,找这两个链表第一个公共节点,如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表(记录为表A,表B)的表…...
【八股文】从浏览器输入一个url到服务器的流程
1.url解析与DNS解析 浏览器解析用户输入的URL,提取协议(HTTP\HTTPS)、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存,若未命中,查询本地hosts文件 最后递归查询向本地DNS服务器发起请求ÿ…...
C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval
目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议) 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...
超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction
1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术,广泛应用于医学影像领域。通过重建和可视化三维结构,3D超声能够显著提高诊断精度和效率,同时减少医生的脑力负担。本技术文档将详细阐述…...
[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议
由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…...
【Linux】Bash是什么?怎么使用?
李升伟 整理 什么是 Bash? Bash(Bourne Again Shell)是一种 命令行解释器(Shell),广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell(sh) 的增强版,提供了更多的功能…...
cmake结合qt开发界面程序实例
在使用 CMake 构建 Qt 界面应用程序时,你需要设置 CMakeLists.txt 文件来指定项目配置、源文件、库依赖等。以下是一个简单的示例,展示了如何创建一个包含 Qt 界面(使用 QWidget)的 Qt 项目,并使用 CMake 进行构建。 …...
vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果
开发过程中遇到需要根据后端返回的数据长度来判断是否需要使用el-tooltip的情况,想到el-table里面就有这种交互效果,如果不论文字是否超出容器长度都展示tooltip的话,交互效果难免会差很多,所以二次封装了这个组件: 给…...
如何创建并保存HTML文件?零基础入门教程
原文:如何创建并保存HTML文件?零基础入门教程 | w3cschool笔记 本文将以Windows系统为例,教你用最简单的记事本创建并保存第一个HTML网页。 📝 第一步:准备工具 文本编辑器:使用系统自带的记事本ÿ…...
React19源码系列之FiberRoot节点和Fiber节点
在上一篇文章,看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建, createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…...
每天看一篇漏洞报告
前言: 内容来源于乌云漏洞 今日思考xss漏洞, 今天看到一篇文章,里面详细说了xss的绕过技巧,虽然时间久了,没有去尝试,待会有时间去测试一下 以下是整理后的文章,原文在下面 文章链接&#…...
采用贝塞尔函数,进行恒定束宽波束形成算法
matlab采用贝塞尔函数,进行恒定束宽波束形成算法 beselle.m , 1452 20191225160928.png , 43700 20191225160935.png , 45238 20191225161010.png , 76862...
TCP协议的多线程应用、多线程下的网络编程
DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式,一个服务端对应一个客户端,实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类,多线程接收socket对象 public class ServerSocketNable implements Run…...
华为中小型企业项目案例
实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...
