您的位置:首页 > 其它

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

2016-12-26 17:25 309 查看
总体思想,对于不重要的数据采用内存临时值即可,不需要存储。对于重要的数据要存储清空时间。

下面只讨论重要的数据。

假设数据需要每天的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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: