wordpress數(shù)據(jù)庫(kù)大數(shù)據(jù)游戲行業(yè)seo整站優(yōu)化
文章目錄
- 0.回顧extern
- 1.介紹
- 2.實(shí)現(xiàn)思想
- 3.代碼
- 測(cè)試代碼
- 熱點(diǎn)管理總結(jié)
0.回顧extern
extern cloudBackup::DataManager *_dataManager
extern 關(guān)鍵字用于聲明一個(gè)全局變量或?qū)ο?#xff0c;而不定義它。這意味著 _dataManager 是一個(gè)指向 cloudBackup::DataManager 類型的指針,但它的定義(即實(shí)際內(nèi)存分配)在其他地方,而不是在當(dāng)前文件中
所以, 你可以理解為: 這行代碼告訴編譯器 _dataManager 是在其他文件中定義的,并且這個(gè)指針在另外文件中已經(jīng)初始化過了。這樣做的目的是讓當(dāng)前文件可以訪問 _dataManager,盡管它的定義是在另一個(gè)文件中
也就是說(shuō), _dataManager在HotManager.hpp中進(jìn)行聲明, 說(shuō)有一個(gè)_dataManager這個(gè)指針對(duì)象。 然后在test.cpp中進(jìn)行定義。
在test.cpp中 定義一個(gè)全局的 _dataManager
1.介紹
服務(wù)器端的熱點(diǎn)?件管理是對(duì)上傳的?熱點(diǎn)?件進(jìn)?壓縮存儲(chǔ),節(jié)省磁盤空間。
熱點(diǎn)?件的判斷在于上傳?件的最后?次訪問時(shí)間是否在熱點(diǎn)判斷時(shí)間之內(nèi),?如如果?個(gè)?件?天都沒有被訪問過我們就認(rèn)為這是?個(gè)?熱點(diǎn)?件,其實(shí)就是當(dāng)前系統(tǒng)時(shí)間,與?件最后?次訪問時(shí)間之間的時(shí)間差是否在?天之內(nèi)的判斷。
需要對(duì)上傳的?件每隔?段時(shí)間進(jìn)?熱點(diǎn)檢測(cè),相當(dāng)于遍歷上傳?件的存儲(chǔ)?件夾,找出所有的?件,然后通過對(duì)逐個(gè)?件進(jìn)?時(shí)間差的判斷,來(lái)逐個(gè)進(jìn)?熱點(diǎn)處理。
將上傳的?件存儲(chǔ)位置與壓縮后壓縮?件的存儲(chǔ)位置分開。這樣在遍歷上傳?件夾的時(shí)候不?于將壓縮過的?件?進(jìn)??熱點(diǎn)處理了。
關(guān)鍵點(diǎn):
上傳?件有??的上傳存儲(chǔ)位置,?熱點(diǎn)?件的壓縮存儲(chǔ)有??的存儲(chǔ)位置
遍歷上傳存儲(chǔ)位置?件夾,獲取所有?件信息。
獲取每個(gè)?件最后?次訪問時(shí)間,進(jìn)?完成是否熱點(diǎn)?件的判斷。
對(duì)?熱點(diǎn)?件進(jìn)?壓縮存儲(chǔ),刪除原來(lái)的未壓縮?件。
2.實(shí)現(xiàn)思想
熱點(diǎn)管理模塊: 對(duì)服務(wù)器上備份的文件進(jìn)行檢測(cè),哪些文件長(zhǎng)時(shí)間沒有被訪問,則認(rèn)為是非熱點(diǎn)文件,則壓縮存儲(chǔ),節(jié)省磁盤空間。
實(shí)現(xiàn)思路:
遍歷所有的文件,檢測(cè)文件的最后一次訪問時(shí)間,與當(dāng)前時(shí)間進(jìn)行相減得到差值,這個(gè)差值如果大于設(shè)定好的非熱點(diǎn)判斷時(shí)間則認(rèn)為是非熱點(diǎn)文件,則進(jìn)行壓縮存放到壓縮路徑中,刪除源文件。
法一:遍歷數(shù)據(jù)管理模塊中backupAInfo.dat
- 從數(shù)據(jù)管理模塊中遍歷所有的備份文件信息
- 遍歷備份文件夾,獲取所有的文件進(jìn)行屬性獲取,最終判斷
法二:直接遍歷備份文件夾backupDir。
遍歷文件夾,每次獲取文件的最新數(shù)據(jù)進(jìn)行判斷,并且還可以解決數(shù)據(jù)信息缺漏的問題
- 遍歷備份目錄,獲取所有文件路徑名稱
- 逐個(gè)獲取最后一次訪問時(shí)間與當(dāng)前系統(tǒng)時(shí)間進(jìn)行比較判斷
- 對(duì)非熱點(diǎn)文件進(jìn)行壓縮處理,刪除源文件
- 修改數(shù)據(jù)管理模塊對(duì)應(yīng)的文件信息(壓縮標(biāo)志->true)
3.代碼
#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include <memory>
#include "dataManager.hpp"//在多個(gè)文件中使用 _dataManager 確保它在每個(gè)文件中都被聲明為extern 但只在一個(gè)源文件中被定義
//聲明全局變量_dataManager 在其他文件中定義
//extern cloudBackup::DataManager *_dataManager;
extern std::shared_ptr<cloudBackup::DataManager> _dataManager;namespace cloudBackup
{class HotManager{private:std::string _backupDir; // 備份文件路徑std::string _zipDir; // 壓縮文件路徑std::string _zipSuffix; // 壓縮文件后綴int _hotTime; // 熱點(diǎn)判定時(shí)間間隔// 熱點(diǎn)文件-返回真bool isHot(const std::string &filename){FileUtil fileUtil(filename);time_t last_atime = fileUtil.LastATime();time_t cur_time = time(NULL);if (cur_time - last_atime > _hotTime)return false;return true;}public:HotManager(){Config *config = Config::GetInstance();_backupDir = config->GetBackupDir();_zipDir = config->GetZipDir();_zipSuffix = config->GetZipSuffix();_hotTime = config->GetHotTime();//QFileUtil tmp1(_backupDir);FileUtil tmp2(_zipDir);tmp1.CreateDirectory();tmp2.CreateDirectory();}// 死循環(huán)bool RunHotManager(){while (true){// 1. 遍歷備份目錄 獲取所有文件名FileUtil fileUtil(_backupDir);std::vector<std::string> array;fileUtil.ScanDirectory(&array);// 2. 遍歷判斷文件是否是熱點(diǎn)文件for (auto &file : array){if (isHot(file) == true) // 熱點(diǎn)文件則不需要特別處理continue;// 3. 獲取文件的備份信息BackupAInfo info;// 文件存在 但hashmap中沒有備份信息 考慮差錯(cuò):設(shè)置該文件的備份信息if (_dataManager->GetOneByFileName(file, &info) == false)info.NewBackupAInfo(file);// 3. 對(duì)非熱點(diǎn)文件進(jìn)行壓縮處理FileUtil tmp(file);tmp.Compress(info._zipPath);// 4. 刪除源文件 修改備份信息tmp.Remove();info._isZipped = true;_dataManager->Update_Table(info);}usleep(1000); // 避免空目錄循環(huán)遍歷 消耗cpu資源過高}return true;}};
}#endif //__MY_HOT__
測(cè)試代碼
#include "fileUtil.hpp"
#include "jsonUtil.hpp"
#include "config.hpp"
#include "dataManager.hpp"
#include "hotManager.hpp"
// #include "service.hpp"
#include <thread>
using namespace std;// 聲明全局指針對(duì)象 如果聲明為局部的
// 當(dāng)出了作用域 生命周期截止 指針對(duì)象銷毀 堆空間泄露
// cloudBackup::DataManager *_dataManager;
std::shared_ptr<cloudBackup::DataManager> _dataManager;
void HotTest()
{cloudBackup::HotManager hot;hot.RunHotManager();
}
int main(int argc, char *argv[])
{//_dataManager 的定義在程序其他部分嘗試訪問它之前就已經(jīng)完成std::shared_ptr<cloudBackup::DataManager> ptr(new cloudBackup::DataManager());_dataManager = ptr;HotTest();return 0;
}
熱點(diǎn)管理總結(jié)
對(duì)備份的文件進(jìn)行檢測(cè),哪些文件長(zhǎng)時(shí)間沒有被訪問,則認(rèn)為是非熱點(diǎn)文件,對(duì)其壓縮存儲(chǔ),節(jié)省磁盤空間。
- 遍歷備份目錄 獲取所有文件名
- 遍歷判斷文件是否是熱點(diǎn)文件
- 對(duì)非熱點(diǎn)文件進(jìn)行壓縮處理
- 刪除源文件 修改備份信息