总结游戏服务器定时清空功能的几种实现

总体思想,对于不重要的数据采用内存临时值即可,不需要存储。对于重要的数据要存储清空时间。

下面只讨论重要的数据。

假设数据需要每天的0点清空

做法一:存储清空的时间(db_clear_time),然后内存计算当前时间是否需要再次清空

int now = time(NULL);
if(now - db_clear_time > ONE_DAY && hour == 0)
{
    db_clear_time = now;
    //TODO clear
}

这种做法的好处是,计算简单。缺点是 假设服务器0点左右发生宕机现在,那么重启之后也是不会清空的,因为有hour==0的判断条件。那要是不要这个hour == 0的判断条件的话,就变成了每隔一天一清空,感觉离要求更远了一些。

方法二:存储下一次的清空时间(db_next_clear_time),这里给出一个计算清空时间的方法

int GetNextClearTime()
{
    struct tm,tm_now;
    time_t now = time(NULL);
    localtime_r(&now,&tm_now);
    return ((int)now - (tm_now.tm_sec+tm_now.tm_min*60+tm_now.tm_hour*60*60)+24*3600); //计算下一个0点的时间
}


int now = time(NULL);
if(now > db_next_clear_time)
{
    db_next_clear_time = GetNextClearTime();
    //TODO clear
}

这种方案只要时间超过一天就会更新,并且下一次的更新时间还是0点,只是计算函数需要认真写一下。

我曾经写过一个每周四0点清空的逻辑这里也分享一下

int GetNextWeekClearTime()
{
    struct tm,tm_now;
    time_t now = time(NULL);
    localtime_r(&now,&tm_now);
    int next_time =((int)now-(tm_now.tm_sec+tm_now.tm_min*60+tm_now.tm_hour*60*60+tm_now.tm_day*24*3600)+4*24*3600);
    if(next_time <= now) next_time += 7*24*3600;
}

int now = time(NULL);
if(now > next_week_clear_time)
{
    next_week_clear_time = GetNextWeekClearTime();
    //TODO clear
}
原文地址:https://www.cnblogs.com/zendu/p/6223067.html