目錄
1.熱點管理文件的基本思路?
2.熱點管理類的設計
3.熱點管理類的實現
?
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(); // 獲取配置文件讀取類的單例,獲取hottimeFileUtil fu(filename);//獲取當前文件的LastAcctimetime_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一下
?