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

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

相关文章

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java