⚡热点管理模块⚡
Posted 努力学习的少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡热点管理模块⚡相关的知识,希望对你有一定的参考价值。
热点管理模块概念
- 如果一个文件在连续一段时间内没有访问到,则该文件是一个非热点文件,否则位热点文件。
- 在服务上上有两个目录,一个目录是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;
以上是关于⚡热点管理模块⚡的主要内容,如果未能解决你的问题,请参考以下文章