问题
员工会登录一个内部服务系统,登录后可以选择休息或工作状态,下班时选择离开。有一个页面要实时展示员工当天休息和工作的累计时长。
有两个数据库表存储员工的数据。
员工状态表:存储员工的当前状态。
员工状态流水表:每次员工状态切换,存储一条日志,记录切换发生的时间,切换前状态,切换后状态。
解决
先建立问题的模型,一个状态图,是员工状态切换的本质。
如下,员工有三种状态,在状态切换时才会有时长被计算进去。其中红色的表示计算为休息时长,蓝色表示工作时长。即从休息状态转出的记录为休息时长,工作状态转出的记录为工作时长。
建立一个新表,存储用户最近一次状态,和状态的获取时间点。还有用户当前的累计休息时长,累计工作时长。
用户请求到来时,通过员工状态表获取员工当前的状态,再根据新表最近的状态和时间点,计算出累计的市场,增加到累计“休息”或累计“工作”时长中。
如果中间有跨越每天切换的时间点,例如零点。那么先更新新表中最近一次状态为切换时间点的状态,清零累计时长,然后按状态机的方法计算累计时长。
计算在线时长如果每次都从日志里遍历,重复计算,是大错特错的。
这个问题要注意两点,已经计算过的,要存储累计数值,不要重复计算,否则后续数据增长会不可控,也消耗性能;清零时间点要做好判断,把清零时刻的状态推算出来然后再套用模型计算即可。
同理,计算游戏在线时长,IM隐身时长等都是一个原理。
转载请注明来源: 如何计算在线时长