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

滑动窗口计数器不能只用map+定时清理,因会漏统计非整点对齐的请求;必须保留带时间戳事件或时间分片,常用环形数组实现,按需shift比ticker更精准高效。滑动窗口计数器为什么不能只用 map + 定时清理直接用 map[string]int 存请求次数、再起 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.slots[c.currentIndex], 1)}</p><p>func (c *SlidingWindowCounter) shift(now int64) {slotStart := now - (now % c.slotDur)for (now - c.timestamps[c.currentIndex]) >= c.windowDur {c.slots[c.currentIndex] = 0c.timestamps[c.currentIndex] = slotStartc.currentIndex = (c.currentIndex + 1) % c.sizeslotStart += c.slotDur}}time.Ticker 驱动清理 vs 按需 shift 的取舍有人用 time.Ticker 每 100ms 触发一次全局 slot 清理,看起来更"主动",但实际引入额外 goroutine 和锁竞争,且无法保证清理时机与请求到达严格同步------可能刚清完一个 slot,下一毫秒就来 1000 个请求,导致瞬时计数虚高。立即学习"go语言免费学习笔记(深入)"; Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
PNP Robotics2 小时前
集智联机器人(PNP)亮相第三届中国具身智能大会,以“双臂+遥操作“多维方案定义具身交互新范式
大数据·人工智能·python·深度学习·机器人
overmind2 小时前
oeasy Python 123 元组_运算_封包解包_欢乐颂_大写数字
java·前端·python
2501_914245932 小时前
HTML5中封装Promise风格的数据库初始化工具函数
jvm·数据库·python
E_ICEBLUE3 小时前
Python 控制 PDF 页面大小、页边距、页面方向与缩放
python·pdf
爱莉希雅&&&3 小时前
Docker 部署 MySQL 双主双从同步架构详细笔记
linux·运维·数据库·mysql·docker·架构·主从同步
Polar__Star5 小时前
如何结合计划任务实现自动定时备份任务配置_全自动化运维管理
jvm·数据库·python
weixin_5806140010 小时前
如何提取SQL日期中的年份_使用YEAR或EXTRACT函数
jvm·数据库·python
2301_8135995510 小时前
SQL生产环境规范_数据库使用最佳实践
jvm·数据库·python
李可以量化10 小时前
QMT 量化实战:用 Python 实现线性回归通道,精准识别趋势中的支撑与压力(下)
python·qmt·量化 qmt ptrade