180625-关于时间窗口的想法

文章目录
  1. 关于滑动时间窗口的想法
    1. I. 基本结构
      1. 1. 数据结构
      2. 2. 问题及注意点
    2. II. 其他
      1. 0. 几点想法
      2. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
      3. 2. 声明
      4. 3. 扫描关注

关于滑动时间窗口的想法

如何设计一个维护当前时间,当之前3min, 5min, 10min, 1h, 24h时间窗口内的访问计数的数据结构,简单来讲就是如何优雅的设计一个滑动时间窗口

I. 基本结构

1. 数据结构

设计的数据结构如下:

  • 在redis中维护1440的数组,其中以当前的时间戳相对于当天0点的分钟数,作为该时间戳对应数组的坐标
1
2
3
4
public static int getMinuteByDay(long time) {
LocalDateTime localDateTime = getDateTimeOfTimestamp(time, TimeConstant.GMT_ZONE);
return localDateTime.getMinute() + localDateTime.getHour() * 60;
}
  • 实时新增数据,维护两个结构

    • 1440数组中的数组块内容实时更新
    • 时间窗口内的总资金新增
  • 释放过期数据,每分钟执行一次

    • 时间窗口内的总资金 - 过期的数据

2. 问题及注意点

  • 新增数据和释放过期数据时,并发安全问题
  • 如何保证能正确及时的删除过期数据,且不会出现重复减的问题

II. 其他

0. 几点想法

简单的想了一个维护时间窗口的想法,也没有深入下去实现,先记录下来,留待后续补齐

关于时间窗口,简单说几点:

  • 实时更新,往往不太现实,特别是数据量特别大的情况下,每s更新一次,都会导致大量的数据计算;因此需要折中方案
  • 关于删除过期的数据,这一块往往是重难点,如何及时删除,并发问题怎么避免,如果用锁,竞争也得考虑?重复删除怎么办?应用挂掉or重启之后,如何保证时间窗口的数据准确性?…

关于时间窗口在生产环境中的应用,并没有想象中的那么简单,虽然目前也没有查到相关的开源库可以直接使用,,但是这一块的实现也挺有意思的,可以好好想一想,研究一二

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

QrCode

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×