云备份day5
- 热点管理模块
热点管理模块
服务器端的热点文件管理是对上传的非热点文件进行压缩存储,节省磁盘空间。
而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内,比如如果一个文件一天都没有被访问过我们就认为这是一个非热点文件,其实就是当前系统时间,与文件最后一次访问时间之间的时间差是否在一天之内的判断。
而我们需要对上传的文件每隔一段时间进行热点检测,相当于遍历上传文件的存储文件夹,找出所有的文件,然后通过对逐个文件进行时间差的判断,来逐个进行热点处理。
基于这个思想,我们需要将上传的文件存储位置与压缩后压缩文件的存储位置分开。这样在遍历上传文件夹的时候不至于将压缩过的文件又进行非热点处理了。
关键点:
- 上传文件有自己的上传存储位置,非热点文件的压缩存储有自己的存储位置
- 遍历上传存储位置文件夹,获取所有文件信息。
- 获取每个文件最后一次访问时间,进而完成是否热点文件的判断。
- 对非热点文件进行压缩存储,删除原来的未压缩文件
服务端热点管理模块实现-热点管理类的设计
//因为数据管理是要在多个模块中访问的,因此将其作为全局数据定义,在此处声明使用即可
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;
}
};