业务需求:
需要知道一个新建的账号在60天内登录的情况。
机智的程序猿们都会想到用stl的各种关联容器去记录而后分析。
经过仔细考量,本猿想到另外一种办法可以简单的实现该需求,并且可以使数据存储尽可能小。
废话不多少,上代码:
void Player::updateLoginStatistics()
{
time_t now = Timestamp::now();
int32_t distance_days = (now - create_time_) / 86400;
if (distance_days > 60) {
return;
}
std::bitset<64> info(login_statistics_);
if (false == info.test(distance_days)) {
info.set(distance_days);
login_statistics_ = info.to_ulong();
}
}
该函数完美解决问题。
记得在玩家登录的地方调用updateLoginStatistics();
大致思路,建号时间和当前时间差值大于60天的不予处理。距离建号n天,那么我们就设置第n位为1。
我们用一个8字节的变量login_statistics_来存储记录。
玩家首次登陆,打印日志如下:
(updateLoginStatistics) before 0 0000000000000000000000000000000000000000000000000000000000000000
(updateLoginStatistics) after 1 0000000000000000000000000000000000000000000000000000000000000001
数据分析:
只需要统计login_statistics_中的2进制中1的分布,就可以查看玩家的登录情况了!!!
是不是猴赛雷