数据分析中可视化图表缓存策略
每一次ad-hoc查询,均是会占用有限的计算资源,而OLAP 系统在现有技术下,并不能支撑很高的查询并发,为了有效改善这个问题,在查询时间范围内数据未发生变化或者变化量小,有效运用缓存可以有效提高查询效率和用户体验
1. 问题
单纯的N小时缓存失效的机制,会导致数据刷新不及时,造成数据理解上的偏差:
现象:在相同指标在不同图表数据不一致,尤其是在同一个DashBoard内时,让人难以理解;
原因:图表在不同时间创建和缓存的,在时间差内,相关的数据发生了变更
2. 方案
2.1 时间机制
在用户行为分析中,相关分析是离不开时间范围的,那么可以
根据时间范围,适当调整缓存时效:
- 图表中相关指标的数据已经不会发生变化,例如查询的时间范围距离现在够久(上月的相关指标,去年的指标),这样的指标缓存几天都没问题,因为数据已经不会发生变更
- 如果相关分析是实时分析当前状态的,比如实时PV,当天分钟级指标,那么缓存机制都不应该加上去
实现方案:对分析条件中的时间进行判断,根据不同场景设置不同的时效
2.2 数据量变化阀值机制
在数据变更量在一定范围内时,业务上允许介绍一定的误差。假设 分析指标中相关事件从缓存时开始计数,对于的事件pv的变化量 未达到 前7日平均pv 的 1% ,则不进行缓存刷新。
以下为实现方案:
1.数据流处理时,记录每个event 的持续累加次数:(total_pv
) 和 过去N日的日pv
:(20181201\_pv,20181202\_pv....dayN\_pv)
- 过去N日的平均pv:
avgPV= SUM(day1~n_pv)/N
- 缓存的时间点的瞬时pv:
pvx
2.后续在进行查询时,会检索查询条件中所有事件,如果其中任意事件触发以下规则,则清理缓存进行重新查询:
1 | - 假设变化量阀值设为 %1 |
对于任意事件,同样的计算规则,不针对单个事件,对所有事件进行持续累积。
3. 备注
- 流处理过程中的pv值需要缓存起来,且数据流每批次处理需要对所有事件的pv值进行更新,对流处理有一定性能影响
- 每次做分析查询,需要对查询中所包含的全部事件进行检索和规则计算,对查询性能有一定影响
- 分析查询结果缓存时需要对所有事件的瞬时PV进行查询并且记录redis,对查询性能有一定影响
- 方案能降低 问题的出现概率,无法完全缓存导致数据不一致的问题,需要在产品层面引导用户;