当前位置: 首页 > news >正文

Sentinel源码—8.限流算法和设计模式总结一

大纲

1.关于限流的概述

2.高并发下的四大限流算法原理及实现

3.Sentinel使用的设计模式总结

1.关于限流的概述

保护高并发系统的三把利器:缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的,比如秒杀抢购。具体就是对并发请求进行限速,或对一个时间窗口内的的请求进行限速,一旦达到限制速率就会拒绝服务或进行流量整形。

常用的限流方式:

一.限制总请求数

如数据库连接池、线程池。

二.限制瞬时并发数

如Nginx的LimitConn模块,可以用来限制瞬时并发连接数。如Java的Semaphore也可以用来限制瞬时并发数。如果需要限制方法被调用的并发数不能超过100(同一时间并发数),则可以使用信号量Semaphore来实现。

三.限制时间窗口内的平均速率

如Guava的RateLimiter、Nginx的LimitReq模块,就可以用来限制每秒的请求速率。如果需要限制方法在一段时间内平均被调用次数不超过100,则可以使用RateLimiter来实现。Guava的RateLimiter只能用于单机的限流,如果想要集群限流,则需要引入Redis或者阿里开源的Sentinel中间件。

四.限制远程接口的调用速率

五.限制MQ的消费速率

六.根据网络、CPU或内存负载等来限流

2.高并发下的四大限流算法原理及实现

(1)固定窗口计数法

(2)滑动窗口计数法

(3)漏桶算法

(4)令牌桶算法

(5)四种限流算法的对比总结

(1)固定窗口计数法

一.实现原理

在一个固定长度的时间窗口内限制请求数量。每来一个请求,请求数加一,如果请求数超过最大限制,就拒绝该请求。

二.算法流程

三.算法存在的问题

问题一:限流不够平滑

例如设置的是每秒限流3个请求,第一毫秒就发送3个请求,达到限流。那么窗口剩余时间的请求都将会被拒绝,这样用户体验就不好。

问题二:存在突发流量的问题

由于在进行窗口切换时,当前窗口的访问总数会立即置为0,所以可能会导致流量突发的问题。

四.算法的代码实现

//注意:下面的实现并没有考虑并发的情况
public class FixWindowLimiter {//窗口的大小,1000mspublic static long windowUnit = 1000;//窗口的最大请求数public static long threshold = 10;//当前窗口内的请求数public static long count = 0;//当前窗口的开始时间public static long lastTime = 0;//限流方法,返回true表示通过public boolean canPass() {//获取当前时间long currentTime = System.currentTimeMillis();//判断当前时间与窗口的开始时间的时间差,是否大于窗口的大小if (currentTime - lastTime > windowUnit) {//当前窗口的请求数设置为0count = 0;//重置当前窗口的开始时间为当前时间lastTime = currentTime;}//判断当前窗口的请求数是否超过窗口的最大请求数if (count < threshold) {count++;return true;}return false;}
}

(2)滑动窗口计数法

为解决固定窗口计数法潜在的流量突发问题,可使用滑动窗口计数法。

一.实现原理

在滑动窗口算法中,窗口的开始时间是动态的,窗口大小是固定的。每来一个请求,就向后推一个时间窗口,计算该窗口内的请求数量。如果请求数超过限制就拒绝请求,否则处理请求 + 记录请求的时间戳。另外还需要一个任务清理过期的时间戳,滑动窗口没有划分固定的时间窗起点与终点。

二.算法存在的问题

虽然解决了流量突发的问题,但限流依然不够平滑。例如设置的是每秒限流3个请求,第一毫秒就发送3个请求,达到限流。那么窗口剩余时间的请求都将会被拒绝,这样用户体验就不好。

三.算法的代码实现

public class SlidingWindowLimiter {//每个窗口的最大请求数量public static long threshold = 10;//窗口大小,1000mspublic static long windowUnit = 1000;//请求集合,用来存储窗口内的请求数量public static List<Long> requestList = new ArrayList<>();//限流方法,返回true表示通过public boolean canPass() {//获取当前时间long currentTime = System.currentTimeMillis();//统计当前时间对应的窗口,收到的请求的数量int sizeOfValid = this.sizeOfValid(currentTime);//判断请求数是否超过窗口的最大请求数量if (sizeOfValid < threshold) {//把当前请求添加到请求集合里requestList.add(currentTime);return true;}return false;}//统计当前时间对应的窗口的请求数private int sizeOfValid(long currentTime) {int sizeOfValid = 0;for (Long requestTime : requestList) {//判断是否在当前时间窗口内if (currentTime - requestTime <= windowUnit) {sizeOfValid++;}}return sizeOfValid;}//清理过期的请求:单独启动一个线程处理private void clean() {//判断是否超出当前时间窗口requestList.removeIf(requestTime -> System.currentTimeMillis() - requestTime > windowUnit);}
}

(3)漏桶算法

它是一种流量整形(Traffic Shaping)和流量控制(Traffic Policing)的算法,它可以有效地控制流量的处理速率以及防止网络拥塞。

一.实现原理

首先,一个固定容量的漏桶,按照固定速率流出水(处理请求)。然后,当流入水的速度过大会直接溢出(请求数量超过限制则直接拒绝)。最后,漏桶里的水不够则无法流出水(漏桶内没有请求则不处理)。

当请求流量正常或者较小时,请求能够得到正常的处理。当请求流量过大时,漏桶算法可通过丢弃部分请求来防止系统过载。

这种算法的一个重要特性是:无论请求的接收速率如何变化,请求的处理速率始终是稳定的,这就确保了系统的负载不会超过预设的阈值。但是由于请求的处理速率是固定的,所以无法处理突发流量。此外如果入口流量过大,漏桶可能会溢出,导致请求丢失。

二.算法的优缺点

优点一:平滑流量

由于以固定的速率处理请求,所以可以有效地平滑和整形流量,避免流量的突发和波动,类似于消息队列的削峰填谷的作用。

优点二:防止过载

当流入的请求超过桶的容量时,可以直接丢弃请求,防止系统过载。

缺点一:无法处理突发流量

由于漏桶的出口速度是固定的,无法处理突发流量。例如,即使在流量较小的时候,也无法以更快的速度处理请求。

缺点二:可能会丢失数据

如果入口流量过大,超过了桶的容量,那么就需要丢弃部分请求。在一些不能接受丢失请求的场景中,这可能是一个问题。

缺点三:不适合处理速率变化大的场景

如果处理速率变化大,或需要动态调整处理速率,则无法满足。

三.算法的代码实现

public class LeakyBucketLimiter {//桶的最大容量public static long threshold = 10;//当前桶内的水量public static long count = 0;//漏水速率(每秒5次)public static long leakRate = 5;//上次漏水时间public static long lastLeakTime = System.currentTimeMillis();//限流方法,返回true表示通过public boolean canPass() {//调用漏水方法this.leak();//判断是否超过最大请求数量if (count < threshold) {count++;return true;}return false;}//漏水方法,计算并更新这段时间内漏水量private void leak() {//获取系统当前时间long currentTime = System.currentTimeMillis();//计算这段时间内,需要流出的水量long leakWater = (currentTime - lastLeakTime) * leakRate / 1000;count = Math.max(count - leakWater, 0);//更新最近一次的漏水时间lastLeakTime = currentTime;}
}

(4)令牌桶算法

令牌桶限流算法也是一种常用的流量整形和限制请求处理速率的算法。

一.实现原理

首先,系统会以固定的速率向桶中添加令牌。然后,当有请求到来时,会尝试从桶中移除一个令牌。如果桶中有足够的令牌,则请求可以被处理。如果桶中没有令牌,那么请求将被拒绝。此外,桶中的令牌数不能超过桶的容量。如果新生成的令牌超过了桶的容量,那么新的令牌会被丢弃。

令牌桶算法的一个重要特性是,它能够处理突发流量。当桶中有足够的令牌时,可以一次性处理多个请求,这对于需要处理突发流量的应用场景非常有用。但是又不会无限制的增加处理速率导致压垮服务器,因为桶内令牌数量是有限制的。

二.算法的优缺点

优点一:可以处理突发流量

令牌桶算法可以处理突发流量。当桶满时,能够以最大速度处理请求。这对于需要处理突发流量的应用场景非常有用。

优点二:限制请求处理的平均速率

在长期运行中,请求的处理速率会被限制在预定义的平均速率下,也就是生成令牌的速率。

优点三:灵活性

与漏桶算法相比,令牌桶算法提供了更大的灵活性。例如,可以动态地调整生成令牌的速率。

缺点一:可能导致过载

如果令牌产生速度过快,可能会导致大量突发流量,使网络或服务过载。

缺点二:需要存储空间

令牌桶需要一定的存储空间来保存令牌,可能会导致内存资源的浪费。

三.算法的代码实现

public class TokenBucketLimiter {//桶的最大容量public static long threshold = 10;//当前桶内的令牌数public static long count = 0;//令牌生成速率(每秒5次)public static long tokenRate = 5;//上次生成令牌的时间public static long lastRefillTime = System.currentTimeMillis();//限流方法,返回true表示通过public boolean canPass() {//调用生成令牌方法this.refillTokens();//判断桶内是否还有令牌if (count > 0) {count--;return true;}return false;}//生成令牌方法,计算并更新这段时间内生成的令牌数量private void refillTokens() {long currentTime = System.currentTimeMillis();//计算这段时间内,需要生成的令牌数量long refillTokens = (currentTime - lastRefillTime) * tokenRate / 1000;//更新桶内的令牌数count = Math.min(count + refillTokens, threshold);//更新令牌生成时间lastRefillTime = currentTime;}
}

(5)四种限流算法的对比总结

一.四种算法的优缺点

固定窗口算法实现简单,但是限流不够平滑,存在突发流量的问题,适用于需要简单实现限流的场景。

滑动窗口算法虽然解决了突发流量的问题,但是还是存在限流不够平滑的问题,所以它适用于需要控制平均请求速率的场景。

漏桶算法的优点是流量处理更平滑,但是无法应对突发流量,适用于需要平滑流量的场景。

令牌桶算法既能平滑流量,又能处理突发流量,适用于需要处理突发流量的场景。

二.令牌桶算法和漏桶算法的对比总结

令牌桶算法就是以固定速率生成令牌放入桶中。每个请求都需要从桶中获取令牌,没有获取到令牌的请求会被阻塞限流。当令牌消耗速度小于生成速度时,令牌桶内就会预存这些未消耗的令牌。当有突发流量进来时,可以直接从桶中取出令牌,而不会被限流。

漏桶算法就是将请求放入桶中,然后以固定的速率从桶中取出请求来处理。当桶中等待的请求数超过桶的容量后,后续的请求就不再加入桶中。

漏桶算法适用于需要以固定速率处理请求的场景。在多数业务场景中,其实并不需要按照严格的速率进行请求处理。而且多数业务场景都需要应对突发流量的能力,所以会使用令牌桶。

但不管是令牌桶算法还是漏桶算法,都可以通过延迟计算的方式来实现。延迟计算指的是不需要单独的线程来定时生成令牌或从漏桶中定时取请求,而是由调用限流器的线程自己来计算是否有足够的令牌以及需要sleep的时间。使用延迟计算的方式,可以节省一个线程资源。

相关文章:

Sentinel源码—8.限流算法和设计模式总结一

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器&#xff1a;缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的&#xff0c;比如秒杀抢购。具体就是对并发请求进行限…...

SpringMVC入门

1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想&#xff0c;SpringMVC即是一种框架&#xff0c;也是一种思想&#xff0c;将前后端彻底分离&#xff0c;后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构&#xff0c;MVC是web开发…...

MYSQL之库的操作

创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...

已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决

已安装爱思助手和Apple相关驱动&#xff0c;但仍无法有线连接iPhone热点&#xff0c;且网络适配器没有Apple Mobile Device Ethernet 问题解决&#xff1a; 用爱思助手连接手机&#xff0c;点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧&#xff0…...

用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday

1、背景与动机 只要你的服务接收并回显用户生成内容&#xff08;UGC&#xff09;——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS&#xff08;Cross‑Site Scripting&#xff09;攻击风险。浏览器在解析 HTML 时会执行脚本&#xff1b;如果不做清理&#…...

MySQL基本查询与数据操作全面解析

目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询&#xff08;慎用&#xff09; 指定列查询 表达式查询 结果去重 3.2 条件查询&#xff08;WHERE子句&#…...

《C++ 模板:泛型编程的核心》

C模板详解 模板是C中实现泛型编程的重要特性&#xff0c;它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...

Web3实战:从零开发你的ERC20代币合约

区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈&#xff0c;手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币&#xff0c;并部署到以太坊Sepolia测试网。以下是完整开发路线图&#xff1a; 一、ERC20代币的…...

简述大疆无人机对接

文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言&#xff0c;对接大疆的…...

docker-compose搭建kafka

1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...

FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载

FramePack 是斯坦福大学主导开发的视频生成框架&#xff0c;是一种用于视频生成的下一帧&#xff08;下一帧部分&#xff09;预测神经网络结构&#xff0c;可以逐步生成视频。FramePack 主要开发者之一&#xff0c;就是业内大名鼎鼎的张吕敏大佬&#xff0c;AI领域的“赛博佛祖…...

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候&#xff0c;有两种情况&#xff1a; 两个Packet的buf引用的是同一数据缓存空间&#xff0c;这时候要注意数据缓存空间的释放问题&#xff1b;两个Packet的buf引用不同的数据缓存空间&#xff0c;每个Packet都有数据缓存…...

基于nlohmann/json 实现 从C++对象转换成JSON数据格式

C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式&#xff0c;在Web服务和应用程序中广泛使用。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读…...

在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用

在视频处理的众多需求中&#xff0c;将视频转换为 AVI 格式是不少用户的刚需。小白工具网&#xff08;https://www.xiaobaitool.net/videos/convert-to-avi/ &#xff09;的在线视频转 AVI 功能&#xff0c;以其显著优势&#xff0c;多格式支持、便捷操作、数据安全保障以及广泛…...

【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础

引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...

L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制

一、为什么需要 Prompt 模板&#xff1f; 在与 AI 模型交互时&#xff0c;我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题&#xff0c;通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在&#xff1a; 固定输出格式&am…...

Java集成Zxing和OpenCV实现二维码生成与识别工具类

Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库&#xff0c;实现二维码的生成和识别功能。识别方法支持多种输入形式&#xff0c;包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...

jenkins pipeline ssh协议报错处理

一、jenkins版本 jenkins&#xff1a;2.492.3 openssh&#xff1a;OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1&#xff1a;手动添加目标主机密钥到Jenk…...

当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?

在数字化的世界里&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型&#xff0c;一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下&#xff0c;当你拿着模糊的财务报表扫描件时&#xff…...

vue watch监听路由,第一次进入不触发解决办法

“第一次进入的时候没触发&#xff0c;第二次就触发了”非常典型&#xff0c;它印证了路由监听&#xff08;无论是 watch $route 还是 beforeRouteUpdate&#xff09;主要是为了监听变化&#xff0c;而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...

JVM考古现场(二十四):逆熵者·时间晶体的永恒之战

"警告&#xff01;时间晶体正在吞噬GC日志&#xff01;" 我腰间的太极八卦镜突然迸发出刺目的量子辉光&#xff0c;终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖&#xff01; 楔子&#xff1a;时间晶体的觉醒 &#x1f56f;️…...

spring中使用netty-socketio部署到服务器(SSL、nginx转发)

spring中使用netty-socketio部署到服务器&#xff08;SSL、nginx转发&#xff09; 本文实现前端socket.io-client连接后端netty-socketio&#xff0c;并且部署到服务器上的示例&#xff0c;以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...

qt.tlsbackend.ossl: Failed to load libssl/libcrypto.

我的环境是windows&#xff0c;QT6.3.2&#xff08;msvc2019_64/mingw_64&#xff09; 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意&#xff0c;是其他方式安装过openssl&#xff0c;环境变量有&#xff0c;但是QT找不到的问题。…...

【Python爬虫基础篇】--3.cookie和session

目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议&#xff0c;请求与请求之间无法相互传递或者记录一些信息&#xff0c;cookie和session正是为了解决这个问题而产生。 例子&#xff1…...

uView的u-modal不显示问题

问题分析&#xff1a;在项目中&#xff0c;其他页面显示正常&#xff0c;在这个页面显示不正常。 问题解决&#xff1a; 一般的原因&#xff0c;诸如层级遮挡控制器true后&#xff0c;被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...

联易融科技:以科技赋能驱动经营反转与价值重估

行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示&#xff0c;截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…...

Python 设计模式:回调模式

1. 什么是回调函数&#xff1f; 回调函数是指作为参数传递给另一个函数的函数。当这个函数执行到某个特定的点时&#xff0c;它会调用这个回调函数。回调函数通常用于处理异步操作、事件处理或在某些条件下执行特定的操作。 回调函数的特点&#xff1a; 作为参数传递&#x…...

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…...

大数据学习(112)-HIVE中的窗口函数

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Hive学习

一、Hive 核心原理 1. Hive 架构与执行流程 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;将 SQL 转化为分布式计算任务&#xff08;MapReduce/Tez/Spark&#xff09;&#xff0c;核心组件如下&#xff1a; 元数据存储&#xff08;Metastore&#xff09;&#xff1a;存储表…...

前端开发核心知识详解:Vue2、JavaScript 与 CSS

一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持&#xff0c;为每个属性定义getter和setter。getter用于收集依赖&#xff0c;当视图中使用到该属性时&#xf…...

仅追加KV数据库

仅追加KV数据库 6.1 我们将要做什么 在本章中&#xff0c;我们将创建一个基于文件的键值存储&#xff08;KV Store&#xff09;&#xff0c;其核心是一个写时复制&#xff08;Copy-on-Write, CoW&#xff09;B 树。这种设计的目标是实现数据的持久性和原子性。 1. 设计概述 …...

【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?

在Java中&#xff0c;Vector、ArrayList和LinkedList均实现了List接口&#xff0c;但它们在线程安全、数据结构、性能特性及应用场景上存在显著差异。 1. Vector、ArrayList 和 LinkedList 的区别 Vector&#xff1a; 线程安全&#xff1a;Vector 是线程安全的动态数组&#…...

Git分支管理方案

成都众望智慧有限公司Git分支管理方案 采用 轻量级Git Flow 敏捷版本控制策略&#xff0c;在保证稳定性的同时提升开发效率。以下是优化后的方案&#xff1a; 1. 精简分支模型&#xff08;相比6-8人团队减少分支层级&#xff09; 分支类型作用生命周期devops生产环境代码&am…...

SQL Tuning Advisor

什么是SQL Tuning Advisor STA可以用来优化那些已经被发现的高负载SQL. 默认情况下, Oracle数据库在自动维护窗口中自动认证那些有问题的SQL并且执行优化建议&#xff0c;找寻提升高负载SQL执行计划性能的方法. ** 如何查看自动优化维护窗口产生的报告? ** SQL> set ser…...

联易融出席深圳链主企业供应链金融座谈会,加速对接票交所系统

近日&#xff0c;深圳市委金融办组织召开全市链主企业供应链金融高质量发展座谈会。联易融作为供应链金融企业代表&#xff0c;与虾皮信息科技、电子元器件和集成电路国际交易中心等代表性机构以及行业协会、金融机构参加了会议。 发展供应链金融是破解中小微企业融资难、融资…...

【前端记事】关于electron的入门使用

electron入门使用 背景how to start第一步 创建一个vite-vue3项目第二步 装各种依赖第三步 配置vite.config.jspackage.jsonelectron入口 启动重写关闭、隐藏、最大化最小化 背景 最近对electron比较感兴趣&#xff0c;折腾一段时间后有了点眉目&#xff0c;记录一下 how to …...

Qt绘制可选择范围的日历

【日历控件设计】 #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QCalendarWidget> #include <QHBoxLayout> #include <QSpinBox> #include <QPushButton> #include <QLabel> #include <Q…...

Pycharm(十五)面向对象程序设计基础

目录 一、定义类及使用类的成员 二、self关键字介绍 三、在类内部调用类中的函数 class 类名&#xff1a; 属性&#xff08;类似于定义变量&#xff09; 行为&#xff08;类似于定义函数&#xff0c;只不过第一个形参要写self&#xff09; 一、面向对象基本概述 属性&…...

【C++游戏引擎开发】第21篇:基于物理渲染(PBR)——统计学解构材质与光影

引言 宏观现象:人眼观察到的材质表面特性(如金属的高光锐利、石膏的漫反射柔和),本质上是微观结构对光线的统计平均结果。 微观真相:任何看似平整的表面在放大后都呈现崎岖的微观几何。每个微表面(Microfacet)均为完美镜面,但大量微表面以不同朝向分布时,宏观上会表…...

flutter_slidable 插件使用

简介 flutter_slidable 是一个用于创建可滑动列表项的 Flutter 插件&#xff0c;它允许用户通过滑动来显示隐藏的操作按钮&#xff0c;比如删除、分享等功能。 安装 在 pubspec.yaml 中添加依赖&#xff08;并运行 flutter pub get&#xff09;&#xff1a; dependencies:fl…...

[论文阅读]ConfusedPilot: Confused Deputy Risks in RAG-based LLMs

ConfusedPilot: Confused Deputy Risks in RAG-based LLMs [2408.04870] ConfusedPilot: Confused Deputy Risks in RAG-based LLMs DEFCON AI Village 2024 文章是针对Copilot这样一个RAG服务提供平台的攻击 在企业环境中整合人工智能工具&#xff08;如 RAG&#xff09;会…...

诠视科技MR眼镜如何使用头瞄点和UGUI交互

诠视科技MR眼镜如何使用头瞄点和UGUI交互 要实现头瞄点计算单元确认键操作UGUI,最快捷的方式&#xff0c;右键直接添加XvHeadGazeInputController。 添加以后会自动生成XvHeadGazeInputController到Head节点下面去。 重要的几个参数讲解&#xff1a; scaleFactor&#xff1a…...

数据赋能(204)——原则与原理——原理方法

原理更多地关注事物本身的客观规律&#xff0c;而原则侧重于指导人们的行为和决策。原则与原理是两个常常被提及&#xff0c;但有所区别的概念。原则和原理在各个领域中都发挥着重要的作用。 原理概念 原理&#xff0c;则通常指的是自然科学和社会科学中具有普遍意义的基本规…...

代码随想录算法训练营第五十六天 | 108.冗余连接 109.冗余连接II

108.冗余连接 题目链接&#xff1a;108. 冗余的边 文章讲解&#xff1a;代码随想录 思路&#xff1a; 题目说是无向图&#xff0c;返回一条可以删去的边&#xff0c;使得结果图是一个有着N个节点的树&#xff0c;如果有多个答案&#xff0c;则返回二维数组中最后出现的边。 …...

Git入门

一、Git 基础概念 1. 版本控制系统分类 本地版本控制&#xff1a;如RCS&#xff0c;仅在本机保存历史版本集中式版本控制&#xff1a;如SVN&#xff0c;单一中央服务器管理代码分布式版本控制&#xff1a;如Git&#xff0c;每个开发者都有完整的仓库副本 2. Git 核心概念 概…...

5G + 物联网:智能世界的催化剂,如何用Python打造下一代IoT应用?

5G 物联网&#xff1a;智能世界的催化剂&#xff0c;如何用Python打造下一代IoT应用&#xff1f; 在数字化时代&#xff0c;物联网&#xff08;IoT&#xff09; 已成为智能产业的关键技术。从智能家居到智慧城市&#xff0c;再到工业4.0&#xff0c;我们的世界正在变得越来越…...