整数二进制充当统计模型
作者:互联网
最近项目中需要统计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次离线
标签:0000,在线,记录,二进制,离线,整数,最近,充当 来源: https://blog.csdn.net/CSDNzhangtao5/article/details/106794829