【云备份|| 日志 day5】文件热点管理模块

简介: 【云备份|| 日志 day5】文件热点管理模块

image.png

云备份day5

热点管理模块

热点管理模块

服务器端的热点文件管理是对上传的非热点文件进行压缩存储,节省磁盘空间。

而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内,比如如果一个文件一天都没有被访问过我们就认为这是一个非热点文件,其实就是当前系统时间,与文件最后一次访问时间之间的时间差是否在一天之内的判断。

而我们需要对上传的文件每隔一段时间进行热点检测,相当于遍历上传文件的存储文件夹,找出所有的文件,然后通过对逐个文件进行时间差的判断,来逐个进行热点处理。

基于这个思想,我们需要将上传的文件存储位置与压缩后压缩文件的存储位置分开。这样在遍历上传文件夹的时候不至于将压缩过的文件又进行非热点处理了。

关键点:

1. 上传文件有自己的上传存储位置,非热点文件的压缩存储有自己的存储位置

2. 遍历上传存储位置文件夹,获取所有文件信息。

3. 获取每个文件最后一次访问时间,进而完成是否热点文件的判断。

4. 对非热点文件进行压缩存储,删除原来的未压缩文件

服务端热点管理模块实现-热点管理类的设计

//因为数据管理是要在多个模块中访问的,因此将其作为全局数据定义,在此处声明使用即可
extern DataManager *_data;
class HotManager{
private:
  std::string _back_dir;
  std::string _pack_dir;
  std::string _arc_suffix;
  std::string _url_prefix;
  time_t _hot_time;
public:
HotManager();
  bool HotJudge(const std::string &file);
  bool RunModule();
};


代码:

class HotManager{
    private:
      std::string _back_dir;
      std::string _pack_dir;
      std::string _pack_suffix;
      int _hot_time;
    private:
      //非热点文件-返回真;热点文件-返回假
      bool HotJudge(const std::string &filename){
        FileUtil fu(filename);
        time_t last_atime = fu.LastATime();
        time_t cur_time = time(NULL);
        if (cur_time - last_atime > _hot_time){
          return true;
        }
        return false;
      }
    public:
      HotManager() {
        Config *config = Config::GetInstance();
        _back_dir = config->GetBackDir();
        _pack_dir = config->GetPackDir();
        _pack_suffix = config->GetPackFileSuffix();
        _hot_time = config->GetHotTime();
        FileUtil tmp1(_back_dir);
        FileUtil tmp2(_pack_dir);
        tmp1.CreateDirectory();
        tmp2.CreateDirectory();
      }
      bool RunModule() {
        while(1){
          //1. 遍历备份目录,获取所有文件名
          FileUtil fu(_back_dir);
          std::vector<std::string> arry;
          fu.ScanDirectory(&arry);
          //2. 遍历判断文件是否是非热点文件
          for (auto &a : arry) {
            if (HotJudge(a) == false){
              continue;//热点文件则不需要特别处理
            }
            //3. 获取文件的备份信息
            BackupInfo bi;
            if (_data->GetOneByRealPath(a, &bi) == false){
              //现在有一个文件存在,但是没有备份信息
              bi.NewBackupInfo(a);//设置一个新的备份信息出来
            }
            //3. 对非热点文件进行压缩处理
            FileUtil tmp(a);
            tmp.Compress(bi.pack_path);
            //4. 删除源文件,修改备份信息
            tmp.Remove();
            bi.pack_flag = true;
            _data->Update(bi);
          }
          usleep(1000);//避免空目录循环遍历,消耗cpu资源过高
        }
        return true;
      }
  };


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
27天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
79 1
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo日志文件输出到指定目录 如何定义?
Dubbo日志文件输出到指定目录 如何定义?
|
1月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
29 0
|
1月前
|
Linux 应用服务中间件 nginx
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
50 0
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
51 0
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo日志文件输出到指定目录 如何定义?
Dubbo日志文件输出到指定目录 如何定义?
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo日志文件输出到指定目录 如何定义?
Dubbo日志文件输出到指定目录 如何定义?
|
2天前
|
Java 数据安全/隐私保护 开发者
【SpringBoot】讲清楚日志文件&&lombok
【SpringBoot】讲清楚日志文件&&lombok
13 5
|
9天前
|
运维 Oracle 关系型数据库
Oracle日志文件:数据王国的“记事本”
【4月更文挑战第19天】Oracle日志文件是数据库稳定运行的关键,记录数据变更历史,用于恢复和故障处理。它们协调并发操作,确保数据一致性和完整性。日志文件实时写入操作信息并定期刷新到磁盘,便于数据恢复。然而,日志文件需备份和归档以保证安全性,防止数据丢失。日志文件,数据王国的“记事本”,默默守护数据安全。
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
36 1