zoukankan      html  css  js  c++  java
  • 总结游戏服务器定时清空功能的几种实现

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

    下面只讨论重要的数据。

    假设数据需要每天的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
    }
  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/zendu/p/6223067.html
Copyright © 2011-2022 走看看