目录
1.热点管理文件的基本思路
服务器端的热点文件管理是对上传的非热点文件进行压缩存储,节省磁盘空间。
而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内。
实现思路也就是遍历所有文件,检测文件最后一次访问时间,与当前时间进行相减得到差值,这个差值如果大于我们设置好的非热点判断时间,则可以认为是非热点文件,此时需要进行压缩存放到压缩路径中,删除源文件
事实上,我们这里有两种选择:
- 从数据管理模块中遍历所有备份文件信息
- 遍历备份文件夹,获取所有文件的属性,然后进行判断。
我们选择第2种,每一次都是获取文件的最新数据然后进行判断,并且还可以解决数据信息缺漏的问题,
我们需要对上传的文件每隔一段时间进行热点检测,相当于遍历上传文件的存储文件夹,找出所有的文件,然后通过对逐个文件进行时间差的判断,来逐个进行热点处理。
基于这个思想,我们需要将上传的文件存储位置与压缩后压缩文件的存储位置分开。
这样在遍历上传文件夹的时候不至于将压缩过的文件又进行非热点处理了。
总结之后,我们得出几个关键点与步骤:
- 上传文件有自己的上传存储位置,非热点文件的压缩存储有自己的存储位置;
- 遍历备份目录,获取所有文件路径名称;
- 逐个获取每个文件最后一次访问时间,进而完成是否热点文件的判断;
- 对非热点文件进行压缩存储,删除原来的未压缩文件,修改数据管理模块对应的信息——压缩标志位设置为true;
2.热点管理类的设计
热点管理类中,只要包含两个成员函数:
HotJudge
:用于判断文件是否为非热点文件;RunModule
:主要的运行函数,完成上述热点管理的全部步骤。
class HotManager
{
public:
HotManager();
bool RunModule(); // 主逻辑函数
private:
bool HotJudge(const std::string &filename); // 判断是否为非热点文件
};
3.热点管理类的实现
hot.hpp
#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include "data.hpp"
extern cloud::DataManager* _data; // 全局数据管理类对象
namespace cloud
{
class HotManager
{
public:
HotManager()
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例
//我们要保证遍历的目录是存在的,不存在就创建一个
FileUtil fu1(config->GetBackDir());
FileUtil fu2(config->GetPackDir());
fu1.CreateDirectory();
fu2.CreateDirectory();
}
bool RunModule()
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例
while(1)
{
// 1.遍历备份目录,获取所有文件名
FileUtil fu(config->GetBackDir());
std::vector<std::string> array;
fu.ScanDirectory(&array);//遍历目录,注意目录不存在的情况,首先需要先创建目录,这个构造函数为我们解决了
// 2.遍历判断文件是否是非热点文件
for(auto &a : array)//a就是每个文件的路径名称
{
if(HotJudge(a) == false)//是热点文件,不用压缩
continue;
//是非热点文件,需要进行压缩
// 3.获取文件备份信息
BackupInfo info;
if(_data->GetOneByRealpath(a, &info) == false)
{
// 现在存在一个文件,但是没有备份信息
info.NewBackupInfo(a);//设计所有信息
}
// 4.对非热点文件进行压缩处理
FileUtil tmp(a);
tmp.Compress(info.pack_path);
// 5.删除源文件,修改备份信息
tmp.Remove();
info.pack_flag = true;
_data->Updata(info);//更新
}
usleep(1000);//避免空目录循环遍历,消耗CPU功率过高
}
return true;
}
private:
bool HotJudge(const std::string &filename)
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例,获取hottime
FileUtil fu(filename);//获取当前文件的LastAcctime
time_t last_atime = fu.LastAcctime();
time_t cur_time = time(NULL);
if(cur_time - last_atime > config->GetHotTime())//判断非热点文件的核心
{
return true;//是非热点文件
}
return false;//是热点文件
}
};
}
#endif
cloud.cc
#include "util.hpp"
#include "conf.hpp"
#include "data.hpp"
#include"hot.hpp"
cloud::DataManager * _data;
void HotTest()
{
_data=new cloud::DataManager();
cloud::HotManager hot;
hot.RunModule();
}
int main(int argc, char *argv[])
{
HotTest();
return 0;
}
这个时候我们换另外一个机器来看
我们发现创建好了backdir和packdir
我们把bundle.h拷贝到这个backdir里面去,静静等待30秒(我们配置文件里面设置的非热点判断时间)
也是成功了。很好了
我们去cloud.dat里面看到压缩记录了。
我们git一下