整数二进制充当统计模型

最近项目中需要统计APP的最近几次的在线离线情况,因为有些商家的网络信号很差,需要根据最近的心跳在线离线情况做一些事情,例如统计商户APP最近10次的在线离线记录,如果最近10次有8次离线那就认识商家是网络比较差的商家,那么就去对这部分商家去做一些其他事情,那么怎么统计好呢?因为统计与计算是要同时记录的。


传统的方式是新建一个在线离线状态记录表,然后从表里面就可以获取最近几次在线离线记录,这个方法比较简单,但是表以后的数据量会越来越大,查询也越来越慢,无用的数据也越来越多。


那么先理清楚需求,只记录最近N次的情况,历史情况无需记录,记录的时候得实时统计最近N次的情况得出一些结论,记录的qps很高。

如果能对每个商户app的最近在线离线情况以一个整数记录就好了,一个app对应一个整数,这个整数实质上是最近在线离线的记录


5这个数值,表面看上去就是一个数字5,但是在计算机的世界里,它其实是0000 0000 0000 0111,那么这32位二进制刚好可以充当最近32次的在线离线情况,1代表在线,0代表离线。由于需求是记录最近10次,但便于扩展,取二进制低20次用作记录在线离线情况

代码如下:

//初始化的二进制值 0
private static final long START_DATA = ~-1;

//二进制的记录的位数
private static final long SIGN_POSITION = ~(-1 << 20);


public void sign(boolean online){
   Long record = getLastNum();
   if(online){
     //在线情况对二进制整体左移一位,然后最低位补1,高12位归零
     record = ((data << 1) + 1) & SIGN_POSITION;
   }else{
     //离线情况对二进制整体左移一位,然后高12位归零
     record = ((data << 1) & SIGN_POSITION;
   }
   setLastNum(record)
}

例如一个整数25,可以看成是

0000 0000 0000 0000 0000 0000 0001 1001

表示最近20次3次在线,17次离线

猜你喜欢

转载自blog.csdn.net/CSDNzhangtao5/article/details/106794829