【云备份】服务端模块-热点管理

2024-08-20 21:52

本文主要是介绍【云备份】服务端模块-热点管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0.回顾extern
  • 1.介绍
  • 2.实现思想
  • 3.代码
    • 测试代码
  • 热点管理总结

0.回顾extern

在这里插入图片描述
extern cloudBackup::DataManager *_dataManager

extern 关键字用于声明一个全局变量或对象,而不定义它。这意味着 _dataManager 是一个指向 cloudBackup::DataManager 类型的指针,但它的定义(即实际内存分配)在其他地方,而不是在当前文件中

所以, 你可以理解为: 这行代码告诉编译器 _dataManager 是在其他文件中定义的,并且这个指针在另外文件中已经初始化过了。这样做的目的是让当前文件可以访问 _dataManager,尽管它的定义是在另一个文件中

也就是说, _dataManager在HotManager.hpp中进行声明, 说有一个_dataManager这个指针对象。 然后在test.cpp中进行定义。

在test.cpp中 定义一个全局的 _dataManager

1.介绍

服务器端的热点⽂件管理是对上传的⾮热点⽂件进⾏压缩存储,节省磁盘空间。
热点⽂件的判断在于上传⽂件的最后⼀次访问时间是否在热点判断时间之内,⽐如如果⼀个⽂件⼀天都没有被访问过我们就认为这是⼀个⾮热点⽂件,其实就是当前系统时间,与⽂件最后⼀次访问时间之间的时间差是否在⼀天之内的判断。
需要对上传的⽂件每隔⼀段时间进⾏热点检测,相当于遍历上传⽂件的存储⽂件夹,找出所有的⽂件,然后通过对逐个⽂件进⾏时间差的判断,来逐个进⾏热点处理。
将上传的⽂件存储位置与压缩后压缩⽂件的存储位置分开。这样在遍历上传⽂件夹的时候不⾄于将压缩过的⽂件⼜进⾏⾮热点处理了。

关键点:

上传⽂件有⾃⼰的上传存储位置,⾮热点⽂件的压缩存储有⾃⼰的存储位置
遍历上传存储位置⽂件夹,获取所有⽂件信息。
获取每个⽂件最后⼀次访问时间,进⽽完成是否热点⽂件的判断。
对⾮热点⽂件进⾏压缩存储,删除原来的未压缩⽂件。

2.实现思想

热点管理模块: 对服务器上备份的文件进行检测,哪些文件长时间没有被访问,则认为是非热点文件,则压缩存储,节省磁盘空间。

实现思路:

遍历所有的文件,检测文件的最后一次访问时间,与当前时间进行相减得到差值,这个差值如果大于设定好的非热点判断时间则认为是非热点文件,则进行压缩存放到压缩路径中,删除源文件。

法一:遍历数据管理模块中backupAInfo.dat

  1. 从数据管理模块中遍历所有的备份文件信息
  2. 遍历备份文件夹,获取所有的文件进行属性获取,最终判断

法二:直接遍历备份文件夹backupDir。

遍历文件夹,每次获取文件的最新数据进行判断,并且还可以解决数据信息缺漏的问题

  1. 遍历备份目录,获取所有文件路径名称
  2. 逐个获取最后一次访问时间与当前系统时间进行比较判断
  3. 对非热点文件进行压缩处理,删除源文件
  4. 修改数据管理模块对应的文件信息(压缩标志->true)

3.代码

#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include <memory>
#include "dataManager.hpp"//在多个文件中使用 _dataManager 确保它在每个文件中都被声明为extern 但只在一个源文件中被定义
//声明全局变量_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;			// 热点判定时间间隔// 热点文件-返回真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();}// 死循环bool RunHotManager(){while (true){// 1. 遍历备份目录 获取所有文件名FileUtil fileUtil(_backupDir);std::vector<std::string> array;fileUtil.ScanDirectory(&array);// 2. 遍历判断文件是否是热点文件for (auto &file : array){if (isHot(file) == true) // 热点文件则不需要特别处理continue;// 3. 获取文件的备份信息BackupAInfo info;// 文件存在 但hashmap中没有备份信息 考虑差错:设置该文件的备份信息if (_dataManager->GetOneByFileName(file, &info) == false)info.NewBackupAInfo(file);// 3. 对非热点文件进行压缩处理FileUtil tmp(file);tmp.Compress(info._zipPath);// 4. 删除源文件 修改备份信息tmp.Remove();info._isZipped = true;_dataManager->Update_Table(info);}usleep(1000); // 避免空目录循环遍历 消耗cpu资源过高}return true;}};
}#endif //__MY_HOT__

测试代码

#include "fileUtil.hpp"
#include "jsonUtil.hpp"
#include "config.hpp"
#include "dataManager.hpp"
#include "hotManager.hpp"
// #include "service.hpp"
#include <thread>
using namespace std;// 声明全局指针对象 如果声明为局部的
// 当出了作用域 生命周期截止 指针对象销毁 堆空间泄露
// cloudBackup::DataManager *_dataManager;
std::shared_ptr<cloudBackup::DataManager> _dataManager;
void HotTest()
{cloudBackup::HotManager hot;hot.RunHotManager();
}
int main(int argc, char *argv[])
{//_dataManager 的定义在程序其他部分尝试访问它之前就已经完成std::shared_ptr<cloudBackup::DataManager> ptr(new cloudBackup::DataManager());_dataManager = ptr;HotTest();return 0;
}

热点管理总结

对备份的文件进行检测,哪些文件长时间没有被访问,则认为是非热点文件,对其压缩存储,节省磁盘空间。

  1. 遍历备份目录 获取所有文件名
  2. 遍历判断文件是否是热点文件
  3. 对非热点文件进行压缩处理
  4. 删除源文件 修改备份信息

在这里插入图片描述

这篇关于【云备份】服务端模块-热点管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091279

相关文章

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2