相关博文:
维持计数时间窗口数据结构的设计
I. 背景
有这么一个场景,我需要维护每个商品在3min, 10mn, 1h, 6h, 24h这几个时间窗口内的贸易总额,那么可以怎么实现?
问题拆解:
- 每个商品,对应多个时间窗口
- 商品可能很多,因此时间窗口的量可能很大
- 时间窗口的数据为总数,因此不需要记录每个订单的情况,只需要维护一个交易总额即可
- 热点数据,可能每分钟都有很多的成交
- 冷门数据,可能一天都没有几笔成交
对于后端而言,数据订正可算是非常非常频繁且常见的事情了,常见的有DB、缓存、内存等数据源中的数据订正,对于非应用内存而言,其他有实体或者可以直接通过官方的提供的控制台连接进行修改的数据订正,相对比较简单,而对于应用内存,如果没有应用内通知并处理相关逻辑,多半就只能重启应用来实现刷新内存缓存了
当然我这里说的也不是内存数据更新,最近遇到的一个问题就是redis缓存中的数据有问题,需要订正,而并不是简单的把数据删了就行,需要根据某些数据,做一些计算,然后得出新的数据,并写回到缓存
这样看来好像也不太麻烦,如果没有第三方依赖,大不了写个python脚本或者php脚本,重新算一下,也没什么毛病
然而实际情况却并不是这样,问题有以下几点:
基于此,就想也米有办法,可以直接搞一个项目,可以执行Groovy脚本,在Groovy脚本中实现数据订正逻辑?需求如下
时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数据,则丢掉
一个简单的实现就是用一个队列来做,新的数据在对头添加;同时起一个线程,不断的询问队尾的数据是否过期,如果过期则丢掉
另外一中场景需要利用到这个时间窗口内的数据进行计算,如计算着五分钟交易中资金的流入流出总和,如果依然用上面的这种方式,会有什么问题?
针对这种特殊的场景,是否有什么取巧的实现方式呢?
Update your browser to view this website correctly. Update my browser now