总体思想,对于不重要的数据采用内存临时值即可,不需要存储。对于重要的数据要存储清空时间。
下面只讨论重要的数据。
假设数据需要每天的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 }