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

Redis限流踩坑记:我的incr+expire组合拳为何打出了永不过期的Key?

Redis限流踩坑记increxpire组合为何会制造永生Key那天下午运维群突然炸开了锅——OCR服务的错误率曲线像坐了火箭一样直线上升。用户反馈页面不断弹出操作过于频繁的提示可后台数据显示这些用户当天的调用次数还不到限额的十分之一。作为负责接口限流逻辑的开发者我盯着监控大屏上那些TTL显示为-1的Redis Key突然意识到自己掉进了一个经典的Redis陷阱。1. 故障现场限流系统为何突然失效事情要从三个月前上线的新版OCR服务说起。为了防范恶意刷接口我们设计了每分钟50次的调用限制。当时调研了几种方案后选择了最轻量级的Redis计数方案// 简化后的限流检查伪代码 func CheckRateLimit(userID string) bool { key : rate_limit: userID count, err : redis.Get(key) if err redis.Nil { // Key不存在时初始化 redis.Set(key, 1, time.Minute) return true } if count 50 { return false } redis.Incr(key) return true }这套逻辑在测试环境运行良好直到那天下午出现诡异现象部分用户的Key变成了永生状态。通过Redis命令查看问题Key时发现了两个致命特征127.0.0.1:6379 TTL rate_limit:user123 (integer) -1 # 永不过期 127.0.0.1:6379 GET rate_limit:user123 2147483647 # 已经累加到最大值更棘手的是这些Key由于没有设置过期时间会永久占用Redis内存。随着时间推移内存使用率持续攀升最终触发了OOM killer。2. 原理深挖incr与expire的原子性陷阱通过复现测试我们终于锁定了问题发生的精确条件Key的TTL剩余最后1秒时用户发起请求服务端通过GET判断未超限此时Key仍存在执行OCR识别耗时超过1秒网络I/O或计算密集型操作执行INCR时Key已自然过期此时Redis的行为出人意料操作时序Redis行为产生后果TTL1s时GET返回当前计数值判断未超限Key自然过期Redis自动删除Key原始计数消失执行INCR创建新Key并设为1TTL默认为-1关键发现INCR命令在操作不存在的Key时会将其初始化为1但不会继承之前的过期时间。这与SET命令的NX/XX参数行为完全不同。3. 临时补救双重检查真的可靠吗我们首先尝试了存在性检查TTL验证的复合方案func SafeIncr(key string) error { // 第一重检查Key是否存在 exists, err : redis.Exists(key) if exists 0 { return redis.Set(key, 1, time.Minute) } // 第二重检查TTL是否有效 ttl, err : redis.TTL(key) if ttl 0 { // -1表示无过期时间-2表示不存在 return redis.Expire(key, time.Minute) } _, err redis.Incr(key) return err }这套方案在大多数情况下工作正常但依然存在理论上的竞态条件检查TTL时返回剩余10ms网络延迟导致INCR命令在Key过期后到达依然会产生无过期时间的Key4. 终极方案Lua脚本实现原子操作Redis的Lua脚本可以保证多个命令的原子执行最终我们采用了如下方案-- KEYS[1] 限流Key -- ARGV[1] 限流阈值 -- ARGV[2] 过期时间(秒) local current redis.call(INCR, KEYS[1]) if current 1 then -- 首次设置时初始化过期时间 redis.call(EXPIRE, KEYS[1], ARGV[2]) else -- 检查是否永不过期 local ttl redis.call(TTL, KEYS[1]) if ttl -1 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end end return current对应的Go实现var rateLimitScript redis.NewScript( local current redis.call(INCR, KEYS[1]) if current 1 then redis.call(EXPIRE, KEYS[1], ARGV[2]) else local ttl redis.call(TTL, KEYS[1]) if ttl -1 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end end return current ) func AtomicIncr(key string, limit int, expiration time.Duration) (int, error) { return rateLimitScript.Run( redisClient, []string{key}, limit, int(expiration.Seconds()) ).Int() }这个方案完美解决了三个问题初始化计数与设置过期时间的原子性防止INCR导致Key永不过期避免多次网络往返带来的竞态条件5. 生产环境优化实践在实际部署中我们还做了以下优化内存保护措施对Lua脚本增加执行超时监控设置Redis的maxmemory-policy为volatile-lru增加监控告警规则检测TTL为-1的限流Key性能对比测试方案QPS平均延迟内存占用原始方案12k1.2ms持续增长双重检查9k1.8ms稳定Lua脚本11k1.3ms稳定异常处理建议// 良好的错误处理范例 func HandleOCRRequest(userID string) error { count, err : AtomicIncr(userKey(userID), 50, time.Minute) if err ! nil { metrics.Increment(redis_errors) return fallbackToLegacyRateLimit() // 降级方案 } if count 50 { return ErrRateLimitExceeded } // 处理业务逻辑 }那次事故后我们在所有使用Redis计数的场景都加上了防永生检查。现在每次看到TTL值为-1的Key都会想起那个手忙脚乱的下午——技术债总是要还的区别只是主动还是被动。

相关文章:

Redis限流踩坑记:我的incr+expire组合拳为何打出了永不过期的Key?

Redis限流踩坑记:increxpire组合为何会制造"永生Key"? 那天下午,运维群突然炸开了锅——OCR服务的错误率曲线像坐了火箭一样直线上升。用户反馈页面不断弹出"操作过于频繁"的提示,可后台数据显示这些用户当天…...

避坑指南:RK3588 GPIO驱动强度(drive-strength)配置实测,不同电平对信号完整性的影响

RK3588 GPIO驱动强度实战:信号完整性调优指南 调试RK3588的高速接口时,你是否遇到过信号波形出现振铃、过冲或者上升沿缓慢的问题?这些现象往往与GPIO驱动强度(Drive Strength)配置不当有关。作为硬件工程师&#xff0…...

告别枯燥寄存器!用CCS+示波器调试DSP28335 PWM(从波形反推配置)

逆向工程实战:用示波器反推DSP28335 PWM寄存器配置 当示波器上的PWM波形与预期不符时,大多数教程会告诉你"查阅寄存器手册第X章"。但今天我们要玩点不一样的——像侦探破案一样,通过观察波形异常反向推导寄存器配置。这种"问题…...

如何用5分钟掌握Illustrator批量替换神器ReplaceItems.jsx?

如何用5分钟掌握Illustrator批量替换神器ReplaceItems.jsx? 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Illustrator中繁琐的批量替换操作而烦恼吗&#xff1f…...

如何高效使用X-TRACK开源GPS自行车码表:完整离线地图与轨迹记录指南

如何高效使用X-TRACK开源GPS自行车码表:完整离线地图与轨迹记录指南 【免费下载链接】X-TRACK A GPS bicycle speedometer that supports offline maps and track recording 项目地址: https://gitcode.com/gh_mirrors/xt/X-TRACK X-TRACK是一款功能强大的开…...

突破语言壁垒:XUnity.AutoTranslator如何革新Unity游戏翻译体验

突破语言壁垒:XUnity.AutoTranslator如何革新Unity游戏翻译体验 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏市场中,语言障碍常常成为玩家体验的拦路虎。XUnity.Au…...

如何随时随地访问你的“进程”?

引言 你有没有经历过这样的场景—— 凌晨一点,你的模型终于跑起来了,预计还要训练六个小时。你心满意足地合上实验室的电脑,骑车回了宿舍。躺在床上刷手机的时候,突然一个念头涌上来:“万一程序崩了呢?”…...

大语言模型文本中的文化特征与作者风格识别技术

1. 项目背景与核心价值在大语言模型(LLM)如GPT系列、Claude等快速发展的当下,模型输出文本中隐含的文化特征和作者身份线索逐渐成为研究热点。这项研究试图通过系统化的信号探测方法,从海量生成文本中识别出文化背景标记和个体写作…...

5分钟掌握Xiaomusic:让小爱音箱变身智能音乐播放器的终极指南

5分钟掌握Xiaomusic:让小爱音箱变身智能音乐播放器的终极指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否厌倦了小爱音箱只能播放内置音乐平台…...

十款顶级跑分与排名软件全解析

AI模型:Deepseek 仅供参考。 电脑性能深度体检:十款顶级跑分与排名软件全解析 引言 跑分软件就像电脑的“体检仪器”——通过标准化负载测试,将处理器、显卡、硬盘等硬件的性能转化为可量化的分数,便于与全球其他配置横向对比…...

5分钟快速上手:ComfyUI-BiRefNet-ZHO实现高质量AI图像视频抠图

5分钟快速上手:ComfyUI-BiRefNet-ZHO实现高质量AI图像视频抠图 【免费下载链接】ComfyUI-BiRefNet-ZHO Better version for BiRefNet in ComfyUI | Both img & video 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BiRefNet-ZHO 还在为复杂的抠图…...

PixelRefer:统一多模态区域级理解框架解析

1. 项目背景与核心价值在计算机视觉与自然语言处理的交叉领域,区域级多模态理解一直是个棘手问题。传统方法往往需要针对不同任务单独训练模型,比如目标检测用YOLO、图像描述生成用BLIP、视觉问答用VQA专用模型。这种割裂的架构导致三个核心痛点&#xf…...

CentOS 7.6 安装 Docker和Docker Compose

目录 一、服务器准备 二、实操 2.1、环境准备 1、更新系统包 2、安装 Docker 所需的软件包 3、设置 Docker 镜像源为国内阿里云的镜像源 2.2、docker安装 1、安装 Docker CE 最新版 5、添加国内 Docker 镜像库 6、重启 Docker 服务 7、设置开机自启动 8、查看docker…...

一站式Nintendo Switch管理神器:NS-USBloader完全指南 [特殊字符]

一站式Nintendo Switch管理神器:NS-USBloader完全指南 🎮 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcod…...

为内部数据分析工具集成Taotoken提供多模型选项

为内部数据分析工具集成Taotoken提供多模型选项 1. 数据分析场景下的模型需求 在企业内部数据分析流程中,文本处理是常见需求。从客户反馈分类到报告自动摘要,不同任务对模型能力的要求差异显著。传统单一模型方案往往难以兼顾质量与成本,而…...

Hermes Agent 多代理 Crew 实战

大多数人装完就卡在“它到底能干啥”这一步,我跑了几个星期后把工作、生活、健康全覆盖了 一位独立技术分析师兼企业架构师,连续几周跑着 Hermes 多代理系统。刚装 OpenClaw 的时候,她盯着界面看了一个小时就关掉了——不是因为难用&#xff…...

26山大软院创新实训--MarketClaw(三)

本周我进行了适配项目具体功能的skills的初步开发,用于为小红书创作内容、撰写文章、生成封面图片和自动化发布。涵盖从内容创作到自动化发布的完整工作流程,包括使用 Pillow 生成封面图片。一、顶层架构设计:我的核心设计思考在写第一行代码…...

AI内容创作效率提升10倍的5个实用工具推荐

随着AI技术的快速发展,内容创作的方式正在被彻底重塑。从选题灵感、素材搜集、初稿撰写、排版优化到发布管理,AI工具正在每一个环节发挥作用。以下是5款经过我长期实战验证、真正能提升内容创作效率的AI工具:1. Notion AI — 一站式创作基地N…...

避开这5个坑,你的SAR回波仿真结果才靠谱 | MATLAB实战经验分享

避开这5个坑,你的SAR回波仿真结果才靠谱 | MATLAB实战经验分享 在合成孔径雷达(SAR)系统设计与算法验证过程中,回波仿真是不可或缺的关键环节。然而,即使对于有一定基础的工程师,也常常会在仿真过程中遇到结…...

3分钟掌握Firmware Extractor:Android固件提取的神器指南

3分钟掌握Firmware Extractor:Android固件提取的神器指南 【免费下载链接】Firmware_extractor Extract given archive to images 项目地址: https://gitcode.com/gh_mirrors/fi/Firmware_extractor 你是否曾经面对各种厂商的Android固件包感到无从下手&…...

《全域数学》 ·72分册·第X卷:兵法原本(第一编·第一章 全文精校版)【乖乖数学】

《全域数学》 72分册第X卷:兵法原本(第一编第一章 全文精校版)【乖乖数学】 作者:乖乖数学 成书:20269503《全域数学》兵法原本(第一编)构建了一套以“正(0)、奇(1)、变(∞)”三元本源为公理化基…...

深度解析安卓ROM解包技术:专业工具实战指南

深度解析安卓ROM解包技术:专业工具实战指南 【免费下载链接】unpackandroidrom 爬虫解包 Android ROM 项目地址: https://gitcode.com/gh_mirrors/un/unpackandroidrom 在安卓系统定制与安全分析领域,安卓ROM解包技术是开发者、安全研究人员和刷机…...

WSL2里systemctl用不了?试试这3种替代方案(含Docker Desktop配置)

WSL2环境下systemctl不可用的三大实用替代方案 如果你在WSL2的Ubuntu环境中尝试使用systemctl命令管理服务时遇到报错,不必感到沮丧。这并非你的操作失误,而是WSL2的设计特性所致。微软的Windows Subsystem for Linux第二版(WSL2)…...

告别手敲命令!个人开源 AI 运维神器 AITerm,用自然语言远程管理服务器

AITerm AI 驱动的智能终端管理工具,通过自然语言指令远程管理服务器。 项目地址:https://gitee.com/newpc/aiterm 简介 在日常运维服务器过程中,经常需要手动输入大量命令。AITerm 旨在通过自然语言交互,让 AI 自动完成这些任务…...

构建个人音频库:跨平台下载工具的技术实现与实践指南

构建个人音频库:跨平台下载工具的技术实现与实践指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 在数字音频内容日…...

告别死记硬背!用‘场景+功能’思维图解SAP FICO核心事务代码(附记忆技巧)

场景化拆解SAP FICO事务代码:从机械记忆到逻辑关联的实战方法论 每次面对SAP FICO模块中密密麻麻的事务代码时,你是否感觉像在背电话号码?那些以F开头的字母数字组合,看似毫无规律地排列在操作界面上。但当我第一次在项目现场看到…...

gRPC 与 Protobuf 实战指南

引言gRPC 是 Google 开源的高性能 RPC 框架,而 Protobuf(Protocol Buffers)则是其默认的序列化协议。两者结合带来了高性能、跨语言、契约优先的现代微服务通信方案。传统的 REST API 使用 JSON 或 XML 作为数据格式,存在以下问题…...

如何在Android手机上实现厘米级高精度定位:开源RTK方案完整指南

如何在Android手机上实现厘米级高精度定位:开源RTK方案完整指南 【免费下载链接】RtkGps Playing with rtklib on android 项目地址: https://gitcode.com/gh_mirrors/rt/RtkGps 还在为手机定位误差大而烦恼吗?想不想让你的Android设备也能实现专…...

解放游戏时间:MAA明日方舟助手如何让日常任务自动化成为现实

解放游戏时间:MAA明日方舟助手如何让日常任务自动化成为现实 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https…...

计算机网络复习(第五章):传输层

第5章 传输层知识点整理 传输层处在应用层和网络层之间,是端到端通信体系中非常关键的一层。网络层解决的是主机到主机之间如何把分组送达的问题,而传输层进一步把通信对象细化到主机中的具体应用进程,使不同主机上的进程可以像直接通信一样交…...