golang如何实现滑动窗口计数器_golang滑动窗口计数器实现思路

滑动窗口计数器不能只用map+定时清理,因会漏统计非整点对齐的请求;必须保留带时间戳事件或时间分片,常用环形数组实现,按需shift比ticker更精准高效。滑动窗口计数器为什么不能只用 map + 定时清理直接用 mapstringint 存请求次数、再起 goroutine 每秒删过期 key,看似简单,但会漏统计。比如窗口是 60 秒,当前时间戳是 1717023450,你只保留 key 对应的"最后更新时间",那 1717023400~1717023449 这 50 秒内的请求就全算不到当前窗口里------因为它们在定时清理时被删了,而新请求还没触发重置逻辑。本质问题是:滑动窗口要求"任意时刻往前推 N 秒"的累计值,不是"整点对齐的桶"。必须保留带时间戳的原始事件,或至少保留足够粒度的时间分片。用环形数组 + 时间分片实现低开销滑动窗口最常用且平衡内存与精度的做法:把窗口切分成固定数量的 slot(如 60 秒窗口切 60 个 1 秒 slot),用环形数组存每个 slot 的计数,再记录每个 slot 对应的起始时间戳。每次计数前先滑动指针、清空已过期 slot。slotDuration 要能整除窗口时长,否则边界计算易错;推荐用 1s/100ms 级别数组长度 = windowSeconds / slotDuration,必须是整数,否则向下取整后窗口实际变短每次 Inc() 前先调用 shift() 检查当前 slot 是否已过期,过期则归零并移动索引并发安全需用 sync.RWMutex 或 atomic 操作 slot 内计数(如果 slot 元素是 uint64)type SlidingWindowCounter struct { slots \[\]uint64 timestamps \[\]int64 slotDur int64 // 单位:毫秒 windowDur int64 // 单位:毫秒 size int mu sync.RWMutex currentIndex int}<p>func (c *SlidingWindowCounter) Inc() {c.mu.Lock()defer c.mu.Unlock()now := time.Now().UnixMilli()c.shift(now)atomic.AddUint64(&c.slotsc.currentIndex, 1)}</p><p>func (c *SlidingWindowCounter) shift(now int64) {slotStart := now - (now % c.slotDur)for (now - c.timestampsc.currentIndex) >= c.windowDur {c.slotsc.currentIndex = 0c.timestampsc.currentIndex = slotStartc.currentIndex = (c.currentIndex + 1) % c.sizeslotStart += c.slotDur}}time.Ticker 驱动清理 vs 按需 shift 的取舍有人用 time.Ticker 每 100ms 触发一次全局 slot 清理,看起来更"主动",但实际引入额外 goroutine 和锁竞争,且无法保证清理时机与请求到达严格同步------可能刚清完一个 slot,下一毫秒就来 1000 个请求,导致瞬时计数虚高。立即学习"go语言免费学习笔记(深入)"; Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
段一凡-华北理工大学8 分钟前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客9 分钟前
以撒的结合
python·游戏·电脑·娱乐
Circ.21 分钟前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
笃行35021 分钟前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
风早爽太1 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
快乐的木子李1 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
excel2 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
李航19832 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程
L@ncor2 小时前
第六章 框架开发实践 · 学习笔记(AutoGen / AgentScope / CAMEL / LangGraph)
python·框架·autogen·langgraph·agentscope
Zhou1411362 小时前
SpringSecurity_02_授权与高级功能
开发语言·python