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

Nginx 限制 IP 网速

  1. 使用Lua和Nginx限制IP网速的基本原理

    • 要限制某个IP的网速,在Nginx中结合Lua可以通过令牌桶算法(Token Bucket)来实现。令牌桶算法是一种流量整形算法,它以一定的速率生成令牌放入桶中,当请求到来时,需要从桶中获取令牌才能通过,若桶中没有足够的令牌,请求就会被延迟或者丢弃,从而达到限速的目的。
  2. 准备工作

    • 安装必要组件:需要安装OpenResty,它集成了Nginx和LuaJIT,为使用Lua扩展Nginx功能提供了基础环境。安装过程因操作系统而异,以Linux系统为例,可以通过官方软件仓库或者从官网下载源代码进行编译安装。
  3. 具体实现步骤和代码示例

    • 定义共享内存区域用于存储IP限速相关信息
      • 在Nginx配置文件(http块内)中,使用lua_shared_dict指令定义一个共享内存区域来存储每个IP的令牌桶相关信息。例如:
        lua_shared_dict rate_limit_bucket 10m;
        
        • 这里定义了一个名为rate_limit_bucket的共享内存区域,大小为10MB,用于存储每个IP的令牌桶数据。
    • 编写Lua代码实现令牌桶算法来限速
      • access_by_lua_block阶段插入Lua代码来实现限速逻辑。以下是一个简单的示例,用于限制单个IP的下载速度为每秒100KB(这里假设每个令牌代表一定的数据量,比如1KB):
        http {lua_shared_dict rate_limit_bucket 10m;server {listen       80;server_name  example.com;access_by_lua_block {local bucket_name = "rate_limit_bucket"local client_ip = ngx.var.remote_addrlocal bucket_size = 100 -- 令牌桶大小,代表100KBlocal fill_rate = 100 -- 每秒填充令牌数,代表每秒填充100KB的令牌local shared_dict = ngx.shared[ bucket_name ]local bucket = shared_dict:get(client_ip)if not bucket thenbucket = { tokens = bucket_size, last_fill = ngx.now() }shared_dict:set(client_ip, bucket)endlocal now = ngx.now()local tokens_to_add = (now - bucket.last_fill) * fill_ratebucket.tokens = math.min(bucket.tokens + tokens_to_add, bucket_size)bucket.last_fill = nowshared_dict:set(client_ip, bucket)if bucket.tokens < 1 thenngx.sleep(0.01) -- 如果没有令牌,延迟请求bucket.tokens = bucket.tokens + 0.01 * fill_rateshared_dict:set(client_ip, bucket)endbucket.tokens = bucket.tokens - 1shared_dict:set(client_ip, bucket)}location / {root   html;index  index.html;}}
        }
        
      • 以下是对上述Lua代码的详细解释:
        • 首先,定义了一些变量,包括bucket_name(共享内存区域名称)、client_ip(客户端IP地址)、bucket_size(令牌桶大小,这里代表100KB)、fill_rate(每秒填充令牌数,这里代表每秒填充100KB的令牌)和shared_dict(获取共享内存区域的引用)。
        • 接着,尝试从共享内存区域获取该IP对应的令牌桶信息。如果不存在,就创建一个新的令牌桶,初始令牌数为bucket_size,并记录初始时间(last_fill)。
        • 然后,计算从上次填充令牌到现在应该填充的令牌数(tokens_to_add),更新令牌桶中的令牌数(bucket.tokens),并更新上次填充时间(last_fill)。
        • 如果令牌桶中的令牌数小于1,说明没有足够的令牌来处理当前请求,就使用ngx.sleep(0.01)延迟请求0.01秒,同时增加一些令牌(bucket.tokens = bucket.tokens + 0.01 * fill_rate)。
        • 最后,从令牌桶中取出一个令牌(bucket.tokens = bucket.tokens - 1),并将更新后的令牌桶信息保存回共享内存区域。
  4. 注意事项和优化建议

    • 精度和实际效果:上述示例只是一个简单的实现,实际的网速限制可能会受到多种因素的影响,如网络波动、服务器负载等。并且,令牌桶算法的参数(如令牌桶大小和填充速率)需要根据实际的网络环境和限速要求进行调整,以达到更准确的限速效果。
    • 内存管理:在使用共享内存区域存储令牌桶信息时,需要注意内存的使用情况。如果有大量的IP需要进行限速,可能会占用较多的内存空间,需要合理规划共享内存区域的大小(如lua_shared_dict指令中定义的大小)。
    • 对性能的影响:在access阶段执行Lua代码来实现限速会对服务器性能产生一定的影响,特别是在高并发的情况下。因此,需要对代码进行优化,例如减少不必要的计算和内存操作,以确保服务器能够高效地处理请求。
  5. 限速原理的进一步解释

    • 令牌桶和请求处理
      • 在上述的实现中,令牌桶的大小(bucket_size)和填充速率(fill_rate)决定了每个IP的网速限制。每个令牌代表一定的数据量(在示例中假设为1KB),每秒填充令牌的数量(fill_rate)就相当于每秒允许通过的数据量。
      • 当一个请求到来时,需要从令牌桶中获取一个令牌才能继续处理。如果令牌桶中有足够的令牌,请求就可以立即通过,这意味着数据可以正常传输。如果令牌桶中没有令牌,请求就会被延迟(通过ngx.sleep),这就相当于限制了数据的传输速度。例如,如果令牌桶每秒填充100个令牌(每个令牌1KB),那么理论上每秒最多允许传输100KB的数据,从而实现了对IP网速的限制。
    • 关于连接数
      • 这种限速方式本身不会直接导致Nginx连接数暴增。因为Nginx仍然按照正常的连接处理机制来处理请求。当请求被延迟时,它只是在等待令牌,而不是建立新的连接。不过,如果大量请求同时被延迟,可能会在一定程度上占用服务器资源,包括内存和CPU等,因为这些等待的请求仍然在服务器的处理队列中。
  6. 更清晰的限速效果实现细节

    • 数据传输的限制
      • 假设一个客户端IP正在请求一个文件,Nginx在处理这个请求时,会检查令牌桶中的令牌数量。如果令牌数量足够,每传输1KB的数据(根据令牌代表的数据量假设),就会消耗一个令牌。如果令牌不足,请求就会被暂停(通过ngx.sleep),暂停的时间根据令牌的补充速度和当前缺少的令牌数量来计算。这样,在单位时间内,传输的数据量就被限制在令牌桶填充速率所允许的范围内,从而实现了网速限制。
    • 动态调整限速参数的效果
      • 可以通过调整令牌桶大小(bucket_size)和填充速率(fill_rate)来改变限速效果。例如,如果想要更严格地限制网速,降低填充速率;如果想要允许客户端在短时间内有更高的突发数据传输,可以增大令牌桶大小。
  7. 避免连接数问题的措施

    • 合理设置限速参数
      • 为了避免大量请求延迟导致资源过度占用,需要合理设置令牌桶的参数。例如,根据服务器的性能和预期的流量,设置合适的填充速率和桶大小。如果填充速率过低,可能会导致过多请求延迟,从而潜在地影响服务器性能;如果填充速率过高,可能无法达到有效的限速效果。
    • 设置连接数限制和超时机制
      • 可以结合Nginx本身的连接数限制功能(如limit_conn指令)来防止连接数暴增。例如,在服务器配置中设置每个IP或者整个服务器的最大连接数,当达到连接数限制时,新的请求可以被拒绝或者等待。同时,设置合理的请求超时机制(如proxy_read_timeout等指令),对于长时间等待令牌而没有响应的请求,及时断开连接,释放资源。

相关文章:

Nginx 限制 IP 网速

使用Lua和Nginx限制IP网速的基本原理 要限制某个IP的网速&#xff0c;在Nginx中结合Lua可以通过令牌桶算法&#xff08;Token Bucket&#xff09;来实现。令牌桶算法是一种流量整形算法&#xff0c;它以一定的速率生成令牌放入桶中&#xff0c;当请求到来时&#xff0c;需要从桶…...

前端小练习——大雪纷飞(JS没有上限!!!)

大家好&#xff0c;我是小黄。 具体效果&#xff1a;&#xff08;大雪缓缓下落&#xff09; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&qu…...

CE4.【C++ Cont】练习题组4

目录 1.求出 e 的值 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 提交结果 2.画矩形 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 简化代码 提交结果 3.查找特定的值 题目描述 输入格式 输出格式 输入输出样例 代码 提交结果…...

uniapp h5 vue3 m3u8 和 mp4 外链视频播放

m3u8视频播放 使用mui-player 和hls.js。 安装npm install mui-player hls.js我的版本是"hls.js": "^1.5.17"和"mui-player": "^1.8.1"使用 页面标签&#xff1a; 引用&#xff1a; 点击目录播放视频&#xff1a; m3u8视频播放&a…...

【动手学运动规划】 4.5 A*算法

我宁愿永远做我自己&#xff0c;也不愿成为别人&#xff0c;即使那个人比你更快乐。 —《成为简奥斯汀》 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 4.5.1 概述 Dijkstra算法是基于广度优先搜索策略来遍历空间内的所有节点&#xff0c;最终计算出…...

从零开始学习 sg200x 多核开发之小核 FreeRTOS 运行

sophpi 小核支持默认运行 FreeRTOS&#xff0c;并且已经启动&#xff0c;小核的运行固件被打包在 fip.bin文件中&#xff0c;由 fsbl 负责加载。 启动后&#xff0c;小核会运行 FreeRTOS&#xff0c;并输出日志到串口。串口日志输出在 UART0 上&#xff0c;波特率 115200&…...

生信软件开发1 - 设计一个简单的Windwos风格的GUI报告软件

1. 安装基础库 使用Windows 11标题样式和主题自定义UI窗口库pywinstyles&#xff08;github: https://github.com/Akascape/py-window-styles&#xff09;&#xff0c;结合python自带tkinter库设计一个报告GUI软件。 pip install pywinstyles2. 设计一个简单的Windwos风格的G…...

openEuler 22.03 使用cephadm安装部署ceph集群

目录 目的步骤规格步骤ceph部署前准备工作安装部署ceph集群ceph集群添加node与osdceph集群一些操作组件服务操作集群进程操作 目的 使用ceph官网的cephadm无法正常安装&#xff0c;会报错ERROR: Distro openeuler version 22.03 not supported 在openEuler上实现以cephadm安装部…...

爬虫项目练手

python抓取优美图库小姐姐图片 整体功能概述 这段 Python 代码定义了一个名为 ImageDownloader 的类&#xff0c;其主要目的是从指定网站&#xff08;https://www.umei.cc&#xff09;上按照不同的图片分类&#xff0c;爬取图片并保存到本地相应的文件夹中。不过需要注意&…...

关于使用注册表修改键盘的键位映射

修改注册表实现键盘的键位映射 前言一、scancode是什么&#xff1f;二、步骤1.打开注册表2.scancode表 总结 前言 弄了个蓝牙的欧洲键盘&#xff0c;但左上角居然是WWW home键&#xff0c;还找不到Esc键&#xff0c;崩溃了&#xff0c;VI都用不了。 赶紧考虑键位映射&#xff…...

[HCTF 2018]WarmUp-滑稽

启动场景打开链接&#xff0c;出现一下图片 F12查看代码出现一个注释&#xff0c;应该在这个文件中&#xff0c; 进入到该页面&#xff0c;出现一段代码 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["sourc…...

WPF+LibVLC开发播放器-进度条显示和拖动控制

进度条显示和拖动控制 视频教程界面上代码实现进度条显示进度进度条拖动视频进度 效果 视频教程 WPFLibVLC开发播放器-进度条控制 界面上 界面上线增加一个Slider控件&#xff0c;当做播放进度条 <SliderName"PlaySlider"Grid.Row"1"Width"800&qu…...

linux下Qt程序部署教程

文章目录 [toc]1、概述2、静态编译安装Qt1.1 安装依赖1.2 静态编译1.3 报错1.4 添加环境变量1.5 下载安装QtCreator 3、配置linuxdeployqt环境1.1 在线安装依赖1.2 使用linuxdeployqt提供的程序1.3 编译安装linuxdeployqt 4、使用linuxdeployqt打包依赖1.1 linuxdeployqt使用选…...

Python3:pytest+request+yaml+allure接口自动化测试

pytest+request+yaml+allure接口自动化测试 一、Pytest的parametrize结合yaml实现数据驱动 1、读取yaml文件数据 ids:- [请求方式,请求地址,请求头,请求参数,预期结果]#测试用例测试数据 testcases:test_login:- ["POST","http://10.1.1.xx:8081/xx/xx"…...

【Docker】针对开发环境、测试环境、生产环境如何编排?

目录 一、引言 二、Docker Compose 文件基础 三、针对不同环境的 Docker 编排 开发环境 测试环境 生产环境 四、配置文件全局变量的编写 五、总结 一、引言 在软件开发和部署的过程中&#xff0c;不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术&…...

数据采集卡的各参数介绍

数据采集卡&#xff08;DAQ 卡&#xff09;是用于测量物理信号&#xff08;如电压、电流、温度等&#xff09;并将其转化为数字信号的设备。 1. 通道数&#xff08;Channels&#xff09; 含义&#xff1a;数据采集卡可以同时采集多少路信号。比喻&#xff1a;通道数就像一个人…...

MySQL备份恢复

华子目录 MySQL日志管理为什么需要日志日志作用日志文件查看方法错误日志通用查询日志慢查询日志示例 撤销日志重做日志二进制日志---重要中继日志 MySQL备份备份类型逻辑备份优缺点备份内容备份工具导入sql文件 MySQL日志管理 为什么需要日志 用于排错用来做数据分析了解程序…...

flask内存马的真谛!!!

flask内存马 1.概念 常用的Python框架有Django、Flask, 这两者都可能存在SSTI漏洞. Python 内存马利用Flask框架中SSTI注入来实现, Flask框架中在web应用模板渲染的过程中用到render_template_string进行渲染, 但未对用户传输的代码进行过滤导致用户可以通过注入恶意代码来实…...

【机器学习02--模型评估】

机器学习 --- 模型评估 你需要得到更好的模型&#xff0c;怎么判断模型更好呢&#xff1f;你需要先得到训练集和测试集&#xff0c;怎么划分它们呢&#xff1f;训练完模型之后&#xff0c;在验证集上测试的时候&#xff0c;用什么指标衡量好坏呢&#xff1f;云里雾里&#xff0…...

【人工智能】深入解析Python中的聚类算法:从K-Means到DBSCAN

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 聚类是一种无监督学习的核心技术,用于将数据点分组到不同的簇中,使得同一簇内的点相似度最大化,不同簇间的点差异性最大化。K-Means和DBSCAN是两种最常见的聚类算法,分别适用于密度驱动和形状复杂的数据分组需…...

【STM32 Modbus编程】-作为主设备读取线圈和输入

作为主设备读取线圈和输入 文章目录 作为主设备读取线圈和输入1、硬件准备与连接1.1 RS452模块介绍1.2 硬件配置与接线1.3 软件准备2、读取线圈2.1 主设备发送请求2.2 从设备响应请求2.3 主机接收数据3、读取输入4、结果本文将在前面文章的基础上,实现主设备通过ModBus协议对从…...

数据结构(栈Stack)

1.前言&#xff1a; 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;是一种基础而存在的数据结构&#xff0c;它的核心特性是后进先出&#xff08;LIFO&#xff0c;Last In, First Out&#xff09;。想象一下&#xff0c;在现实生活中我们如何处理一堆托盘——我们…...

Maven 中scope 的provided、compile、runtime、test、system 含义

在 Maven 中&#xff0c;<scope> 定义了依赖的可见性和生命周期。不同的 scope 值指示 Maven 在编译、测试和运行时如何处理这些依赖。以下是 Maven 中的几种常用依赖范围及其详细说明&#xff1a; 1. <scope>provided</scope> 含义&#xff1a;provided 范…...

Nginx 负载均衡和反向代理

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器&#xff0c;广泛应用于负载均衡中。它的负载均衡功能支持多种策略&#xff0c;可以有效分配流量到后端服务器&#xff0c;提升系统的可靠性和可用性。 负载均衡 首先&#xff0c;Nginx 负载均衡配置是通过在 Nginx 配置文件…...

【网络安全】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 SecGPT 更新时间&#xff1a;2024-05-08 访问地址: GitHub 描述&#xff1a; SecGPT的愿景是将人工智能技术引入网络安全领域&#xff0c;以提高网络防御的效率和效果。其使命是推动…...

大数据(一)MaxCompute

一、引言 作者后面会使用MaxCompute&#xff0c;所以在进行学习研究&#xff0c;总会有一些疑问产生&#xff0c;这里讲讲作者的疑问和思路 二、介绍 MaxCompute&#xff08;原名 ODPS - Open Data Processing Service&#xff09;是阿里云提供的大数据处理平台&#xff0c;专…...

数据科学与大数据之间的区别

什么是数据科学&#xff1f; 数据科学是一个跨学科领域&#xff0c;它将统计学和计算方法相结合&#xff0c;旨在从数据中提取见解和知识。它涉及收集、处理、分析以及解读数据&#xff0c;以揭示可用于为决策过程提供依据并推动创新的模式、趋势和关系。 数据科学涵盖了广泛…...

IP 地理位置定位技术原理概述

本文深入探讨 IP 地理位置定位技术的原理。介绍了 IP 地址的基本概念及其在网络中的作用&#xff0c;随后阐述了基于数据库查询、基于网络拓扑分析以及基于机器学习算法的三种主要 IP 地理位置定位技术原理中的基于IP数据库查询。 IP 地址基础 IP 地址是互联网协议&#xff0…...

多进程multiprocessing通信multiprocessing.Queue

multiprocessing.Queue 通常只能在主模块&#xff08;即 if __name__ "__main__": 块&#xff09;中创建和使用。这是因为 multiprocessing 模块在 Windows 系统上需要通过 if __name__ "__main__": 块来避免递归导入问题。 from multiprocessing import…...

工业—使用Flink处理Kafka中的数据_ChangeRecord2

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,每隔 1 分钟输出最近 3 分钟的预警次数最多的 设备,将结果存入Redis 中, key 值为...

微信小程序4-内容溢出滚动条

感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、功能描述 在前一篇文章的隐藏框页面的功能里&#xff08;《微信小程序3-显标记信息和弹框》&#xff09;&#xff0c;我想添加一个内容溢出的时候&#xff0c;可通过滑动滚动条&#xff0c;实现查看溢出部分的内容&a…...

python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250+个项目、26.6GB)

文章目录 源代码下载地址项目介绍预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250个项目、26.6GB) 预览 项目备注 1、该资源内项目代码都经过测试运行成功&#xff0c;功能ok的情…...

ProjectSend 身份认证绕过漏洞复现(CVE-2024-11680)

0x01 产品描述: ProjectSend 是一个开源文件共享网络应用程序,旨在促进服务器管理员和客户端之间的安全、私密文件传输。它是一款相当流行的应用程序,被更喜欢自托管解决方案而不是 Google Drive 和 Dropbox 等第三方服务的组织使用。0x02 漏洞描述: ProjectSend r1720 之前…...

算法训练-搜索

搜索 leetcode102. 二叉树的层序遍历 法一&#xff1a;广度优先遍历 leetcode103. 二叉树的锯齿形层序遍历 法一&#xff1a;双端队列 法二&#xff1a;倒序 法三&#xff1a;奇偶逻辑分离 leetcode236. 二叉树的最近公共祖先 法一&#xff1a;递归 leetcode230. 二叉…...

【C++】map和set

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 关联式容器2. 键值对3. set3.1 set的模板参数列表3.2 set的构造3.3 set的迭代器3.4 set的容量3.5 set修改操作3.6 multiset 4. map4.1 map的模板参数说明4.2 map的构造4.3 map的迭代器4.4 map的容量与元素访问4.5 …...

MongoDB安装|注意事项

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…...

使用playwright自动化测试时,npx playwright test --ui打开图形化界面时报错

使用playwright自动化测试时&#xff0c;npx playwright test --ui打开图形化界面时报错 1、错误描述&#xff1a;2、解决办法3、注意符号的转义 1、错误描述&#xff1a; 在运行playwright的自动化测试项目时&#xff0c;使用npm run test无头模式运行正常&#xff0c;但使用…...

Linux ufw 命令详解

简介 UFW(Uncomplicated Firewall) 简单防火墙是一款基于 iptables 构建的、用于管理防火墙规则的用户友好型工具。它简化了在 Linux 系统上配置防火墙的过程。 安装 在 Ubuntu/Debian 上安装 sudo apt update sudo apt install ufw在 CentOS/Red Hat 上安装 sudo yum ins…...

3248. 矩阵中的蛇

3248. 矩阵中的蛇 题目链接&#xff1a;3248. 矩阵中的蛇 代码如下&#xff1a; class Solution { public:int finalPositionOfSnake(int n, vector<string>& commands){int i 0, j 0;for (string& command : commands){if (command "LEFT") { j…...

图片的懒加载

目录 懒加载的来源 事件监听 IntersectionObserver 懒加载的来源 图片的来加载其实就是延迟加载&#xff0c;我们知道浏览器的可视范围是有限的&#xff0c;现在网页的内容越来越丰富&#xff0c;一般网页的内容都是需要滚动才能完成浏览 如果网页有很多图片&#xff0c;然…...

网络脚本生成器

网络官网地址 网络配置生成工具 终端-接入-汇聚-核心-防火墙-互联网路由器 一 开局配置 华为设备配置命令 system-viewsysname SW-JR-Switchvlan 10 vlan 20 vlan 30 vlan 40 quitinterface Vlan-interface 40 ip address 192.168.40.1 255.255.255.0 quitip route-static 1…...

Kibana server is not ready yet

遇到“Kibana server is not ready yet”错误通常表示Kibana无法连接到Elasticsearch。以下是一些常见原因及其解决方案&#xff1a; 1.常见原因 1.1.Elasticsearch未运行&#xff1a; 确保Elasticsearch服务已启动并正常运行。您可以通过访问 http://localhost:9200 来检查…...

Git 高频命令及其功能、作用与使用场景

在软件开发的世界里&#xff0c;Git 已经成为了版本控制的代名词。无论你是开发小型项目还是参与大型团队协作&#xff0c;Git 都是你不可或缺的得力助手。今天我们来聊聊 Git 中的一些高频命令&#xff0c;了解它们的功能、作用以及常见的使用场景&#xff0c;帮助你在日常开发…...

将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式

文章目录 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式MathType安装问题MathType30天试用延期MathPage.wll文件找不到问题 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式 word自带公式编辑器编辑的公式格式&#xff1a; MathType编辑的格式&a…...

【HarmonyOS】Component组件引入报错 does not meet UI component syntax.

【HarmonyOS】Component组件引入报错 一、问题背景 有时会碰到引入组件时&#xff0c;无法import引入组件&#xff0c;导致引入的组件报错。 或者提示does not meet UI component syntax. &#xff08;不符合UI组件语法。&#xff09; 如下图所示&#xff0c;在引入组件时&a…...

力扣-图论-1【算法学习day.51】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

使用lumerical脚本语言创建定向耦合器并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建定向耦合器波导、计算定向耦合器的偶数和奇数模式、分析定向耦合器的波长依赖性、分析定向耦合器的间隙依赖性(代码均有注释详解)。 一、绘制定向耦合器波导 1.1 代码实现 # 这段代码主要实现了绘制定向耦合器波导几何结构的功能。通过定义各种…...

Java面试要点50 - List的线程安全实现:CopyOnWriteArrayList

文章目录 一、引入二、实现原理解析2.1 写时复制机制2.2 读写分离策略 三、性能测试分析四、应用场景分析4.1 事件监听器管理4.2 缓存实现 五、最佳实践建议5.1 性能优化技巧5.2 常见陷阱规避 总结 一、引入 在并发编程中,线程安全的集合类扮演着重要角色。CopyOnWriteArrayLi…...

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...

Vue2和Vue3的区别

响应式系统 Vue 2 技术基础&#xff1a;使用 Object.defineProperty 实现响应式。局限性&#xff1a; 无法监听新增属性&#xff1a;如果在创建实例后添加新属性&#xff0c;这些属性不会自动成为响应式的。数组变更检测问题&#xff1a;直接通过索引设置值或长度不会触发更新…...