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


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

    下面只讨论重要的数据。

    假设数据需要每天的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
    }
  • 相关阅读:
    Linux停SVN提交时强制写日志
    svn文件提交时强制写注释
    ssh 登录出现的几种错误以及解决办法
    Linux内存调试工具初探-MEMWATCH
    段错误调试神器
    Linux环境下段错误的产生原因及调试方法小结
    pthread_create()之前的属性设置
    Linux netstat命令详解
    Linux route命令详解和使用示例(查看和操作IP路由表)
    tomcat最大线程数的设置
  • 原文地址:https://www.cnblogs.com/zendu/p/6223067.html
Copyright © 2020-2023  润新知