热点管理模块概念
- 如果一个文件在连续一段时间内没有访问到,则该文件是一个非热点文件,否则位热点文件。
- 在服务上上有两个目录,一个目录是backdir存储的是热点文件,一个目录是packdir存储的是非热点文件
- 热点管理模块每隔一段时间都会遍历backdir下的热点文件,如果一个文件在连续一段时间内没有访问到,则说明该文件是一个非热点文件,则热点管理模块会对该文件进行压缩到packdir目录下,删除backdir的热点文件,节省磁盘空间.
实现思路
成员变量
- 热点管理模块需要包含热点时间,热点文件的目录backdir,非热点文件目录packdir,压缩文件后缀等信息 ,这些信息可以从配置文件管理模块中获得。
成员函数run实现思路
- 对服务器上的backdir目录下的文件进行检测,哪些文件长时间没有被访问, 则认为为非热点文件。
- 如果在热点时间内没有访问过该文件,则认为是非热点文件,压缩原文件,并将压缩文件放入到packdir目录下,删除原文件,并利用文件信息管理模块将该文件信息中的压缩标志设置为true,当客户端要下载该文件时,可以直接通过压缩标志判断是否去哪一个目录获取文件数据。
#pragma once
#include"FileInfoManger.hpp"
namespace sjp{
class HotSpotManger{
private:
int hot_time;
std::string back_dir;//压缩文件目录;
std::string pack_dir;//备份文件目录;
std::string pack_file_suffix;
static std::mutex lock;
static HotSpotManger* instant;
HotSpotManger(){
hot_time=sjp::Config::GetInstant()->GetHotTime();
back_dir=sjp::Config::GetInstant()->GetBackDir();
pack_dir=sjp::Config::GetInstant()->GetPackDir();
pack_file_suffix=sjp::Config::GetInstant()->GetPackFileSuffix();
}
HotSpotManger(HotSpotManger&)=delete;
public:
//热点文件返回true,非热点文件返沪false
static HotSpotManger* GetInstant(){
if(instant==nullptr){
lock.lock();
if(instant==nullptr){
instant=new HotSpotManger();
}
lock.unlock();
}
return instant;
}
//热点文件返回true
//非热点文件返回false
bool JudgeHotspotFile(std::string& backpath){
sjp::FileUtil fu(backpath);
time_t atime=fu.GetFileAccessTime();
time_t curtime=time(NULL);
if(curtime-atime>hot_time){
return false;
}
return true;
}
void Run(){
sjp::FileUtil fu(back_dir.c_str());
if(!fu.Exist())
{
fu.CreateDir(back_dir);
}
while(true){
std::vector<std::string> arry;
fu.GetPathInDir(arry);
for(int i=0;i<arry.size();i++){
//获取文件信息
sjp::FileInfo fileinfo;
if(!sjp::FileInfoManger::GetInstant()->GetOneByRealPath(arry[i],fileinfo))
{
//存储文件中没有该文件信息
fileinfo.AddFileInfo(arry[i]);
sjp::FileInfoManger::GetInstant()->Insert(fileinfo);
}
if(!JudgeHotspotFile(fileinfo.back_path)){
/*1.非热点文件进行压缩
*2.删除源文件
3.修改文件列表中的信息
*/
sjp::FileUtil fu(arry[i]);
std::string packfilepath=pack_dir+fu.GetFilename()+pack_file_suffix;
fu.PackFile(packfilepath);
fu.Remove();
fileinfo.pack_sign=true;
sjp::FileInfoManger::GetInstant()->update(fileinfo);
}
}
sjp::FileInfoManger::GetInstant()->Storage();
usleep(1000);
}
}
};
sjp::HotSpotManger* HotSpotManger::instant=nullptr;
std::mutex HotSpotManger::lock;
}