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 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
兵慌码乱11 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei14 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi0020 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn21 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵2 天前
用 Python 实现 Take-Away 游戏
python·游戏