• 开启SSH服务遇到SELinux未禁用的解决方案
    要临时禁用 SELinux,可以执行以下步骤:查看 SELinux 的状态,可以使用以下命令: sestatus如果 SELinux 处于 “enabled” 状态,会看到类似这样的输出: SELinux status: enabled临时禁用 SELinux,可以使用以下命令: sudo setenforce 0 这将把 SELinux 设置为 “Permissive” 模式,允许操作但会记录违规行为。确认 SELinux 的状态已更改为 “Permissive”,可以再次运行 sestatus 命令,您将看到类似这样的输出: SELinux status: permissive注意:这只会在临时情况下禁用 SELinux,重启服务器后将恢复为默认状态。要永久性地禁用 SELinux,需要编辑 /etc/selinux/config 文件,并将 SELINUX 设置更改为 “disabled”。使用编辑器(如 vi 或 nano)打开配置文件:sudo vi /etc/selinux/config找到 SELINUX 行并将其更改为:SELINUX=disabled保存并关闭文件。然后,重新启动服务器,SELinux 将在启动时被禁用。注意:禁用 SELinux 可能会影响系统的安全性。如果选择禁用 SELinux,请确保采取其他安全措施以保护系统。关闭防火墙可能会导致安全风险,如果仍然希望关闭防火墙,请根据操作系统使用以下命令:对于 CentOS 7 及更早版本:sudo systemctl stop firewalld sudo systemctl disable firewalld对于 CentOS 8 及更新版本,以及 Fedora:sudo systemctl stop firewalld sudo systemctl disable firewalld重新启动ssh服务sudo systemctl restart sshd
  • git恢复指定提交历史
    要恢复 Git 提交历史,将某个提交之后的所有提交「删除」并推送到远程仓库,按照以下步骤操作。前提条件你已经确定要彻底删除 提交 w235f2345234... 之后的所有提交。你正在操作的分支(如 main 或 master)没有其他人正在工作。你有权限 强制推送(force push) 到远程仓库。所有本地的修改要么已经被提交,要么已经被保存(避免数据丢失)。操作步骤1. 查看当前分支git branch确保你在正确的分支上(例如 main 或 feature-xxx)。2. 硬重置到目标提交git reset --hard w235f23452346d1d3bad05403ebce0a54c4ad这会将 本地分支的 HEAD、索引和工作目录 全部设置为 w235 提交的状态。--hard 选项会丢弃所有未提交的更改,包括工作目录和暂存区的修改,请确保你不需要保留这些数据。3. 强制推送到远程仓库git push -f origin main把 main 替换为你实际使用的分支名。注意事项强制推送(-f)风险强制推送会覆盖远程分支的历史。这意味着:其他协作开发者的本地历史与远程不一致。如果他们没有进行正确的同步操作,可能会丢失提交、冲突或数据紊乱。在多人协作的项目中要谨慎操作,并提前沟通。备份建议在执行任何历史重置前,建议创建一个备份分支:git branch before-reset这可以帮助你在误操作后恢复。完成后的验证推送后,验证:git log --oneline确认当前提交历史只包含 w235 之前的提交。FAQQ:如何确认提交 w235 是否在当前分支的分支链中?git log --oneline main查看是否存在该提交。Q:如何查看提交之后的所有提交?git log w235..HEAD --oneline
  • git rm --cached 详解
    在 Git 中,git rm --cached 和 git rm(不加 --cached)的主要区别在于 是否保留本地文件 以及 是否从版本控制中移除。以下是详细对比:1. git rm --cached <file>作用:将文件从 Git 的 暂存区(索引) 和 版本库 中移除,但 保留本地工作目录中的文件。结果:文件不再被 Git 跟踪(即从版本控制中移除,.gitignore 类似效果)。文件本身仍保留在本地磁盘(未被删除)。下次提交时,文件的变更会被完全忽略(除非重新 git add)。典型场景:误将文件加入 Git 后想取消跟踪(如临时文件、配置文件等)。配合 .gitignore 使用(先 git rm --cached 后添加忽略规则)。示例:git rm --cached config.env # 移除跟踪,本地保留 config.env git commit -m "Stop tracking config.env" 2. git rm <file>(不加 --cached)作用:将文件从 暂存区、版本库和本地工作目录 中 完全删除(物理删除)。结果:文件从 Git 跟踪中移除。文件被从本地磁盘删除(需谨慎操作)。下次提交时,文件的删除会被记录。典型场景:永久删除不需要的文件(如冗余的旧文件)。示例:git rm obsolete.txt # 删除 obsolete.txt 的跟踪和本地文件 git commit -m "Remove obsolete.txt" 关键对比总结命令是否从 Git 移除跟踪是否删除本地文件适用场景git rm --cached <file>是否取消跟踪但保留本地文件git rm <file>是是彻底删除文件(跟踪+本地)注意事项恢复文件:如果误用 git rm(不加 --cached),可以用 git restore --staged <file> 恢复暂存区,但本地文件需从回收站恢复或重新创建。路径规范:两种命令都支持 -r 参数来递归操作目录(如 git rm -r dir/)。提交生效:两种操作均需 git commit 后才能生效(仅在暂存区时不影响其他协作者)。总结想保留本地文件 → 用 --cached(仅取消跟踪)。想彻底删除文件 → 直接 git rm(跟踪和本地一起删)。操作前建议先备份重要文件!
  • git clone 跳过大文件下载
    在使用 git clone 时跳过 Git LFS(Large File Storage)下载可以节省时间,特别是在不需要仓库中的大文件时。方法 1:禁用 LFS 克隆(简单推荐)在克隆命令中添加 GIT_LFS_SKIP_SMUDGE 环境变量:GIT_LFS_SKIP_SMUDGE=1 git clone <仓库URL> 作用:跳过 LFS 文件的下载(指针文件会保留,但不会拉取实际的大文件内容)。后续操作:若需单独下载某个 LFS 文件,可使用:git lfs pull --include="路径/到大文件" 方法 2:仅克隆仓库(不含 LFS 元数据)如果连 LFS 指针文件也不想下载(纯代码克隆):git clone --filter=blob:none <仓库URL> 效果:仅克隆提交历史和工作目录结构,不下载任何大文件(包括指针文件)。注意:需要使用较新版本的 Git(≥2.22)。方法 3:克隆后删除 LFS 文件若已经克隆但想清理已下载的 LFS 文件:git lfs uninstall rm -r .git/lfs/ # 删除 LFS 缓存 将移除本地 LFS 存储的文件(但保留指针文件)。方法 4:永久全局禁用 LFS(谨慎使用)git config --global lfs.fetchinclude "" git config --global lfs.fetchexclude "*" 效果:全局配置 Git 忽略所有 LFS 文件下载。注意事项指针文件:跳过 LFS 后,仓库中可能会看到 LFS 指针文件(文本文件,包含哈希值)。恢复下载:之后需要 LFS 文件时,运行 git lfs pull 即可。
  • OpenSSL生成自签名证书填写DN信息详解
    在使用OpenSSL生成自签名证书的时候,会有如下提示:You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:上述是 OpenSSL 在生成 证书签名请求(CSR) 或 自签名证书 时要求填写的 可分辨名称(DN, Distinguished Name) 信息,用于标识证书持有者的身份。详细说明:DN(可分辨名称)是 X.509 证书中用于唯一标识证书持有者(如网站、服务器、公司等)的信息。包含国家、组织、域名等多个字段。当前提示的含义Country Name (2 letter code) [AU]:要求输入 国家代码(2位字母),如 CN(中国)、US(美国)。[AU] 是默认值(澳大利亚),直接按回车会使用该默认值。如果输入 .,则该字段留空(不推荐)。后续可能出现的其他字段(常见DN字段)在下一步中,OpenSSL 还会依次询问:State or Province Name (full name) [](省/州名,如 Beijing、California)Locality Name (city) [](城市名,如 Shanghai、New York)Organization Name (company) [](组织/公司名,如 Tencent、Google LLC)Organizational Unit Name (department) [](部门名,如 IT Department)Common Name (domain name) [](最重要的字段!通常是域名,如 example.com)Email Address [](可选,管理员邮箱)如何填写?必填字段:Country Name(国家)、Common Name(域名)。可选字段:省、市、部门等可留空(直接回车跳过)。默认值:如果提示中有 [XX](如 [AU]),直接回车会使用该默认值。示例(生成CSR时填写)Country Name (2 letter code) [AU]: CN State or Province Name (full name) []: Beijing Locality Name (city) []: Beijing Organization Name (company) []: Example Inc Organizational Unit Name (department) []: IT Common Name (domain name) []: example.com Email Address []: admin@example.com注意事项Common Name (CN) 必须与证书使用的域名一致(如网站域名或服务器主机名)。如果是自签名证书(测试用),可随意填写,但生产环境需确保准确。
  • vim 编辑器翻页指南
    在 Vim 中翻页有多种方式:整页翻页向下翻页(下一页)Ctrl + f(f = forward)相当于 Page Down 键。向上翻页(上一页)Ctrl + b(b = backward)相当于 Page Up 键。半页翻页向下翻半页Ctrl + d(d = down)向上翻半页Ctrl + u(u = up)精确滚动向下滚动一行Ctrl + e(e = expose)向上滚动一行Ctrl + y(y = yield)光标保持在屏幕位置翻页时光标会跟随移动。若希望光标保持在屏幕固定位置:z + Enter:光标移动到屏幕顶部。z + .:光标移动到屏幕中间。z + -:光标移动到屏幕底部。其他导航行首/行尾:0(行首) / $(行尾)文件首/尾:gg(文件首) / G(文件尾)小技巧数字 + 翻页命令:例如 5Ctrl + f 会向下翻 5 页。结合搜索:先按 / 搜索关键词,再用 n/N 跳转后翻页。在 Vim 中翻页,常用快捷键如下:按 Ctrl + f 向下翻一页,Ctrl + b 向上翻一页;使用 Ctrl + d 向下半页滚动,Ctrl + u 向上半页滚动。要快速跳转到文件开头可输入 gg,跳转到末尾则按 G。掌握这些组合后,可以高效浏览文件。根据习惯选择合适的方式即可!
  • docker.io/library 详解
    docker.io/library 是 Docker 官方镜像库中的默认命名空间(namespace)Docker 官方镜像library 是 Docker Hub 上存储 官方镜像 的顶层命名空间。这些镜像由 Docker 官方或受信任的开源项目维护,经过安全性和质量审核。例如:nginx、python、ubuntu 等官方镜像的实际地址为 docker.io/library/nginx、docker.io/library/python。隐式省略规则使用 docker pull 时,如果只指定镜像名(如 ubuntu),Docker 会自动补全为 docker.io/library/ubuntu。若拉取第三方镜像(如 bitnami/nginx),则会解析为 docker.io/bitnami/nginx。URL 结构分解docker.io:Docker Hub 的注册表地址。library:官方镜像的命名空间,类似 GitHub 的官方仓库。使用场景直接拉取:docker pull nginx(等效于 docker pull docker.io/library/nginx)。显式指定:某些场景(如私有仓库)需完整路径以避免歧义。与其他仓库对比私有仓库(如 registry.example.com/myapp)或第三方仓库(如 gcr.io/google-containers/busybox)会有不同的域名和命名空间。总结:docker.io/library 是 Docker 官方镜像的存储位置,日常使用时通常省略前缀,但了解完整路径有助于理解镜像的来源。
  • SSH 跳板机配置指南
    SSH 跳板机配置指南使用 ssh -J 命令快速跳转通过命令行直接跳转语法:ssh -J [跳板机用户名]@[跳板机IP/域名] [目标用户名]@[目标IP/域名] 典型示例ssh -J root@jump.server.com root@target.server.com使用 SSH Config 持久化配置编辑 ~/.ssh/config 文件添加以下配置:# 目标服务器别名(可自定义) Host target-server # 目标服务器真实地址 HostName target.server.com # 目标服务器用户名 User root # 跳板机配置 ProxyJump root@jump.server.com使用简化命令连接ssh target-server配置参数说明参数说明示例值Host自定义目标服务器别名target-serverHostName目标服务器真实IP/域名target.server.comUser目标服务器登录用户rootProxyJump跳板机连接信息root@jmp.svr.com提示:配置完成后可通过 ssh -v target-server 查看详细连接过程进行调试
  • 【话题交流】谈谈大家对本次HDC2025学到的知识知多少
    本月话题:谈谈大家对本次HDC2025学到的知识知多少本次 HDC2025 大会亮点满满,HarmonyOS 6 开发者 Beta 版发布,其在端侧智能、系统流畅性、全场景互联等方面技术迭代显著。比如社交与办公软件消息加载和文档处理效率提升,碰一碰功能覆盖超 50 款主流应用,100 多款应用支持跨设备接续。智能体概念推动操作系统角色转变,大众点评、深圳航空等应用接入智能体带来便捷体验。还有华为云开源的柔性智算平台、云原生 AI 智能调度等前沿技术。来盘点下,这些关键知识你掌握了多少?
  • 【话题交流】华为云CloudDevice 会使终端的游戏功能更加强大嘛?
    华为云CloudDevice在HDC 2025上精彩登场,6月21日,华为开发者大会(HDC 2025)期间,华为云CloudDevice首次在国内发布全系列云终端产品,包括支持XR健身和AI体感游戏的云机顶盒、不受终端设备限制畅玩的云游戏、具有AI知识助手功能的云空间等产品,以及备受关注的云手机。华为云CloudDevice 会使终端的游戏功能更加强大嘛?
  • 【合集】存储服务2025.06月技术干货合集
    删除数据库权限的限制与回收原理cid:link_10走进华为云CCI的CloudBursting解决方案cid:link_11如何优化华为云云容器Serverless应用性能cid:link_0APIG支持的监控指标有哪些cid:link_12IAM可以设置的登录验证策略有哪些?cid:link_1华为云内容审核获取请求认证的方式有哪些?cid:link_2一文带你了解华为云对象存储服务的存储类别cid:link_3华为云CCE评估资源预热功能的投资回报率和成本效益cid:link_4华为云CCE的服务网格和微服务架构的集成cid:link_13华为云CCE Autopilot确保数据安全性和隐私保护详解cid:link_14华为云CCE Autopilot的云生态服务cid:link_5Roach工具与OpenGauss备份适配性cid:link_15GaussDB PG 支持的标准日期时间类型​​详解cid:link_6一文带你了解自监督学习中的对比学习的负样本采样策略cid:link_16图神经网络中的数学原理cid:link_7神经架构搜索(NAS)如何通过自动化设计优化模型性能cid:link_8GAN模式崩溃及解决方案cid:link_17知识图谱与深度学习的结合cid:link_18联邦学习有效解决数据隐私与模型训练矛盾的方法cid:link_19多模态大模型的语义关联cid:link_20生成式AI模型实现语言理解与生成的核心cid:link_21CCE Autopilot支持的存储选项cid:link_22一招降低华为云CCE使用资源预热时运维成本和复杂性cid:link_9Redis实现限流方式比较cid:link_23华为云OBS中obsutil上传文件优化实践cid:link_24华为云MRS中pythonUDF调用实践cid:link_25
  • [公告] 华为AI百校计划2.0申报指南
    华为AI百校计划2.0购买昇腾AI云算力资源指导书:参考文档相关地址参考:华为AI百校计划2.0官网地址:cid:link_5查询账号id地址:https://console.huaweicloud.com/iam/?region=cn-north-4&locale=zh-cn#/mine/apiCredential华为云官网:https://www.huaweicloud.com/?utm_source=bing&utm_medium=brand&utm_campaign=&utm_content=&utm_term=&utm_adplace=AdPlace090661价格详情:cid:link_3大模型即服务平台 MaaS文档:cid:link_4ModelArts业务选型:cid:link_1     华为AI百校计划2.0官网地址:cid:link_5         华为AI百校计划2.0官网地址:cid:link_5     华为AI百校计划2.0官网地址:cid:link_5
  • 华为云MRS中pythonUDF调用实践
    华为云MRS(MapReduce Service)中的Hive支持使用Python实现自定义函数(UDF),但​​原生Python UDF需依赖特定环境配置​​,而通过TRANSFORM子句调用Python脚本则是更通用且灵活的实现方式。1. ​​Python UDF的原生支持​​​​有限支持​​:华为云MRS Hive的官方文档提到,当前仅支持​​参数数量≤5​​的Hive UDF,且​​不支持复杂数据类型​​(如数组、结构体)的Python UDF。这意味着直接通过CREATE FUNCTION创建Python UDF可能受限,尤其对需要聚合(UDAF)或表生成(UDTF)的场景。​​依赖环境​​:若需使用Python UDF,需确保集群已配置Python环境(如安装PyHive或Hive Server 2的Python驱动),但华为云未明确提供开箱即用的支持说明。2. ​​TRANSFORM实现Python处理(推荐方案)​​通过TRANSFORM子句调用外部Python脚本是​​最常用的替代方案​​,适用于所有类型的自定义逻辑(UDF/UDAF/UDTF)。其核心原理是:Hive将数据通过标准输入(stdin)传递给Python脚本,脚本处理后再通过标准输出(stdout)返回结果。​​实现步骤​​:​​编写Python脚本​​:读取sys.stdin,按\t分割字段。处理数据后,用print输出结果,字段间同样用\t分隔。​​示例场景​​:​​UDF​​:单行处理(如身份证解析、字符串大写转换)。​​UDAF​​:多行聚合(如统计总分、平均分)。​​UDTF​​:单行生成多行(如JSON数组展开)。# 示例:UDF(字段大写转换)import sysfor line in sys.stdin: fields = line.strip().split('\t') print('\t'.join(field.upper() for field in fields))​​上传脚本至HDFS/OBS​​:将脚本上传到分布式存储(如HDFS或OBS),并确保执行用户有读取权限。​​HiveQL调用​​:使用ADD FILE加载脚本,并通过TRANSFORM调用:ADD FILE hdfs:///path/to/script.py; -- 加载脚本SELECT TRANSFORM (col1, col2) USING 'python3 script.py' AS (output_col1 STRING, output_col2 INT) FROM table;​​优点​​:​​灵活性​​:支持任意Python库(如pandas、numpy)。​​跨版本兼容​​:不依赖Hive的UDF接口限制。​​适用性广​​:可模拟UDF、UDAF、UDTF所有功能。​​缺点​​:​​性能开销​​:数据需序列化传输,比原生Java UDF慢。​​调试复杂​​:错误需通过日志排查(如YARN Container日志)。3. ​​生产环境注意事项​​​​权限控制​​:在Kerberos认证集群中,需为业务用户授予HDFS文件读取权限及Hive执行权限。​​资源管理​​:避免脚本内存溢出,可调整YARN Container资源参数(如mapreduce.map.memory.mb)。​​高可用​​:若需持久化函数,建议封装为Java UDF(性能更优),仅临时需求使用TRANSFORM。4. ​​方案对比与选型建议​​​​方案​​​​适用场景​​​​优势​​​​限制​​​​原生Python UDF​​简单标量处理(参数≤5)语法简洁,类似内置函数不支持复杂类型,华为云支持有限​​TRANSFORM + Python​​复杂逻辑、聚合、表生成灵活支持所有Python库性能较低,调试复杂​​Java UDF​​高性能需求、生产环境核心逻辑执行效率高,兼容性好开发成本高,需Java知识💡 ​​推荐场景​​:​​临时分析​​:使用TRANSFORM快速实现Python逻辑。​​生产部署​​:对性能敏感场景改用Java UDF(参考华为云文档开发指南)。总结华为云MRS Hive​​可通过TRANSFORM子句高效支持Python自定义处理​​,尽管原生Python UDF受限,但TRANSFORM的灵活性足以覆盖大多数需求。建议结合性能要求选择方案,并优先参考华为云官方示例进行部署。若需进一步优化,可探索华为云Flink或Spark的Python API扩展能力。
  • 华为云OBS中obsutil上传文件优化实践
    在华为云OBS中,通过obsutil上传文件时​​无法直接通过命令行参数设置对象的过期时间(如7天后自动删除)​​,但可以通过​​对象元数据Expires字段​​实现单个文件的定时删除功能。以下是具体分析和操作建议:🔍 一、Expires字段的功能解析​​核心作用​​Expires是OBS系统定义的元数据字段,用于​​指定对象的过期删除时间​​(单位为天)。上传时设置该字段后,对象将在指定天数后被自动删除,无需依赖桶级的生命周期规则。​​示例​​:设置Expires=7,对象将在上传满7天后自动删除。​​与生命周期的区别​​:此字段仅作用于当前上传的对象,而生命周期规则覆盖整个桶或前缀匹配的批量对象。​​技术实现方式​​​​API/SDK支持​​:通过PUT或POST请求上传对象时,在请求头中添加x-obs-expires字段并赋值为整数(如x-obs-expires: 7)。​​obsutil的限制​​:当前版本的obsutil命令行工具​​不支持直接在上传命令中设置Expires参数​​。官方文档明确该功能仅可通过API或SDK实现。⚙️ 二、替代方案:如何实现上传时设置过期若需在上传时指定过期时间,可通过以下两种方式:​​使用OBS SDK(推荐)​​以Python SDK为例,上传时通过expires参数设置:from obs import ObsClientclient = ObsClient(access_key_id='AK', secret_access_key='SK', server='https://your-endpoint')# 设置7天后过期resp = client.put_file('bucketname', 'objectname', 'localfile', expires=7)支持语言:Java/Python/Go等主流SDK均提供expires参数。​​调用REST API​​在PUT请求头中显式添加x-obs-expires:PUT /objectname HTTP/1.1Host: bucketname.obs.cn-north-4.myhuaweicloud.comx-obs-expires: 7需自行处理签名和文件分块等细节。⚖️ 三、与生命周期规则的对比​​特性​​​​Expires字段(对象级)​​​​生命周期规则(桶级)​​​​配置方式​​上传时单个设置桶级别批量配置​​灵活性​​针对不同对象设置不同过期时间按前缀/标签统一规则​​功能范围​​仅支持删除,不支持存储类型转换支持删除、低频/归档存储转换​​适用场景​​临时文件、短期日志长期归档、存储成本优化​​运维复杂度​​低(无需维护规则)中(需管理规则优先级)⚠️ 四、关键注意事项​​优先级冲突​​若对象同时匹配桶生命周期规则和Expires字段,​​对象级Expires的删除操作优先执行​​。​​时间计算规则​​过期计时从对象上传完成后的​​下一个UTC零点开始​​(例如6月27日15:00上传,6月28日00:00开始计时)。实际删除可能延迟≤24小时(系统扫描周期影响)。​​多版本控制​​若桶启用了多版本,需为每个版本单独设置Expires,否则仅当前版本受影响。💎 五、最佳实践建议​​临时数据场景​​:使用SDK上传时设置expires参数,避免维护生命周期规则。​​长期管理需求​​:若需统一管理大量对象(如日志归档),仍建议配置生命周期规则,支持存储类型自动降级。​​工具选择​​:obsutil → 仅基础上传/下载;​​SDK/API​​ → 需高级功能(过期策略、加密等)。可通过华为云OBS SDK文档查看完整代码示例:OBS SDK参考。
  • Redis实现限流方式比较
    基于Redis实现限流是分布式系统中保护服务稳定的核心手段,主要包含四种实现方式,其适用场景和优劣对比如下:🔢 1. ​​固定窗口计数器(Fixed Window)​​​​原理​​:将时间划分为固定窗口(如1分钟),通过Redis的INCR命令统计请求数,达到阈值后限流,并通过EXPIRE设置窗口过期时间。​​示例代码​​(Spring Boot + RedisTemplate):public boolean isAllowed(String key, int limit, int windowSec) { Long count = redisTemplate.opsForValue().increment(key); if (count == 1) redisTemplate.expire(key, windowSec, TimeUnit.SECONDS); return count <= limit;}​​优点​​:实现简单,内存占用低(O(1)),性能高(压测可达12万QPS)。​​缺点​​:存在​​临界时间问题​​(窗口切换时可能瞬间涌入2倍阈值流量)。​​适用场景​​:低频接口防护(如小型网站)或对精度要求不高的场景。⏱️ 2. ​​滑动窗口(Sliding Window)​​​​原理​​:使用Redis的有序集合(ZSET)记录请求时间戳,每次请求移除过期时间戳,统计窗口内剩余请求数。​​示例代码​​:public boolean isAllowed(String key, int limit, int windowSec) { long now = Instant.now().getEpochSecond(); redisTemplate.opsForZSet().removeRangeByScore(key, 0, now - windowSec); // 清理旧请求 Long count = redisTemplate.opsForZSet().zCard(key); if (count < limit) redisTemplate.opsForZSet().add(key, UUID.randomUUID().toString(), now); return count < limit;}​​优点​​:​​精准控制流量​​,解决临界问题,适合非均匀流量的API限流。​​缺点​​:内存占用高(存储所有时间戳),性能较低(压测约8.5万QPS)。​​适用场景​​:高精度要求的API(如支付接口)。🪙 3. ​​令牌桶算法(Token Bucket)​​​​原理​​:定时向Redis List中添加令牌,请求时从List中弹出令牌(LPOP),无令牌则限流。支持突发流量(桶内令牌可一次性消耗)。​​实现步骤​​:定时任务向List填充令牌(如每秒10个)。请求调用LPOP获取令牌,失败则限流。​​优点​​:​​兼顾速率与突发流量​​(如秒杀系统),压测性能约9.8万QPS。​​缺点​​:需维护定时任务,实现复杂(需Lua脚本保证原子性)。🪣 4. ​​漏桶算法(Leaky Bucket)​​​​原理​​:请求进入Redis List(桶),以固定速率从List中取出请求处理(如每秒10次),桶满则拒绝请求。​​特点​​:​​强制恒定速率​​,无突发处理能力,压测性能最低(约7.2万QPS)。​​适用场景​​:需严格平滑流量的场景(如数据库写入保护)。🔍 ​​方案对比与选型建议​​​​算法​​精度突发流量支持性能复杂度适用场景固定窗口计数器低❌⭐⭐⭐⭐简单低频接口、简单防护滑动窗口高⚠️(部分)⭐⭐⭐中等API网关、高精度控制​​令牌桶​​中✅⭐⭐⭐复杂​​秒杀、突发流量场景(推荐)​​漏桶高❌⭐⭐复杂恒定速率处理(如日志上传)​​综合推荐​​:​​首选令牌桶​​:需应对突发流量(如促销活动),且允许短暂超限。​​次选滑动窗口​​:需精确控制(如API开放平台)。​​简单场景​​:固定窗口(如内部管理后台)。⚠️ ​​实践注意事项​​​​原子性​​:滑动窗口和令牌桶建议使用Lua脚本,避免并发问题。​​性能瓶颈​​:高频请求下优先选固定窗口或令牌桶。​​集群部署​​:通过Hash Tag确保Redis Key分布在同一节点。最终方案取决于业务需求:​​稳定性 > 突发处理 > 精度 > 性能​​。建议结合压测结果调整参数(如令牌生成速率、窗口大小)。
总条数:2015 到第
上滑加载中