最近在做一个有关于统计的项目,关于接入网络的。
背景是,一个接入设备可以接入几十个用户,各个用户可能会同时同时会打电话。
要想统计各个用户的电话数据,而且要保存有历史数据。
首先要知道每一个用户要保存有历史数据,所以难免会做到数据持久化过程中的添删查。
这个过程中尤其是查找时比较耗时的。
而且还有一个重点是,我们只是用一个线程为用户记录数据,也就是说,当用户通话结束之后,我们会为用户计算数据,一直到持久化数据结束。
然后再为另一个用户服务。
这就会有一个问题。多个用户同时结束通话,那我们处理过程不如意,为第一个用户处理完,在持久化完,然后在处理第二个用户,那就会给第二个用户带来数据的不准确性。
我们想到的解决办法就是讲计算和持久化分开。因为计算的时间复杂度比较少。而持久化的时间复杂度就比较大。
所以设计就是
一个线程只做通话结束就计算,计算完了就push到链表。
这个链表就如同一个缓冲区,输入的一端就像是我们电脑的IO。
只是说电脑的输入表较慢,处理比较快,而这里相反,数据来的比较快,处理的比较慢(持久化)。
另一个线程就是对这个list处理,每两秒处理一次,或者1秒。 这样就比较均匀的处理。
来的快的数据放在list。
均匀处理list