上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.1.4 通过时间戳定位Bucket
Bucket用于统计各项指标数据,WindowWrap类用于记录Bucket的时间窗口信息(包括时间窗口的开始时间戳和大小),而WindowWrap数组就是一个滑动窗口。
当收到一个请求时,可以根据收到请求时的时间戳和滑动窗口大小计算出一个索引值,从滑动窗口(WindowWrap数组)中获取一个WindowWrap类,从而获取WindowWrap类包装的Bucket,并调用Bucket实例的add方法统计指标。
根据当前时间戳定位Bucket的算法实现如下。
上述代码实现的功能:通过当前时间戳计算出当前时间窗口的Bucket(New Bucket)在数组中的索引(cidx),以及Bucket的时间窗口的开始时间戳,并通过索引从数组中获取Bucket(Old Bucket)。
① 当cidx处不存在Bucket时,创建一个新的Bucket,并且确保线程被安全写入数组中的cidx处,将此Bucket返回。
② 当Old Bucket不为空,且Old Bucket的时间窗口的开始时间戳与当前计算得到的New Bucket的时间窗口的开始时间戳相等时,该Bucket就是当前要找的Bucket,将此Bucket直接返回。
③ 当计算出New Bucket的时间窗口的开始时间戳大于当前数组中的cidx处存储的Old Bucket的时间窗口的开始时间戳时,可以复用这个Old Bucket,确保线程能够安全地重置Bucket,并返回Bucket。
④ 当计算出New Bucket的时间窗口的开始时间戳小于当前数组中的cidx处存储的Old Bucket的时间窗口的开始时间戳时,直接返回一个空的Bucket,因为时间不会倒退。