文章目录
关于滑动时间窗口的想法
如何设计一个维护当前时间,当之前3min, 5min, 10min, 1h, 24h时间窗口内的访问计数的数据结构,简单来讲就是如何优雅的设计一个滑动时间窗口
I. 基本结构
1. 数据结构
设计的数据结构如下:
- 在redis中维护1440的数组,其中以当前的时间戳相对于当天0点的分钟数,作为该时间戳对应数组的坐标
1 | public static int getMinuteByDay(long time) { |
实时新增数据,维护两个结构
- 1440数组中的数组块内容实时更新
- 时间窗口内的总资金新增
释放过期数据,每分钟执行一次
- 时间窗口内的总资金 - 过期的数据
2. 问题及注意点
- 新增数据和释放过期数据时,并发安全问题
- 如何保证能正确及时的删除过期数据,且不会出现重复减的问题
II. 其他
0. 几点想法
简单的想了一个维护时间窗口的想法,也没有深入下去实现,先记录下来,留待后续补齐
关于时间窗口,简单说几点:
- 实时更新,往往不太现实,特别是数据量特别大的情况下,每s更新一次,都会导致大量的数据计算;因此需要折中方案
- 关于删除过期的数据,这一块往往是重难点,如何及时删除,并发问题怎么避免,如果用锁,竞争也得考虑?重复删除怎么办?应用挂掉or重启之后,如何保证时间窗口的数据准确性?…
关于时间窗口在生产环境中的应用,并没有想象中的那么简单,虽然目前也没有查到相关的开源库可以直接使用,,但是这一块的实现也挺有意思的,可以好好想一想,研究一二
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840