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

news2024/11/15 23:30:01

文章目录

  • 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();

			//Q
			FileUtil 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外部接入tensorboard和Jupyter Notebook

本地端打开服务器端jupyter Notebook 1:服务器端在目标文件夹下输入jupyter notebook --no-browser --port8888&#xff08;留意下token&#xff09; 2&#xff1a;本地端打开git 的bash窗口输入ssh -L 8888:localhost:8888 warren10.12.14.187 warren为用户名&#xff0c;10…

get 请求获取不到参数,但是post参数可以获取到

一&#xff1a;测试代码时发现&#xff0c;get请求一直获取不到参数。最终原因如下&#xff0c;nginx配置中需求有下面的配置 $args&#xff1a;代表接受到的参数

MemFire Cloud是否真的可以取代后端

近年来&#xff0c;随着前端技术的迅速发展&#xff0c;前端工程师们越来越多地开始思考一个问题&#xff1a;“我还能不能不依赖后端&#xff1f;” 这种想法并非空穴来风&#xff0c;尤其是随着像MemFire Cloud这样的工具出现&#xff0c;它不仅能让开发者在没有后端的情况下…

2. springboot集成kafka入门使用教程

项目demo地址 : https://mp.weixin.qq.com/s?__bizMzkzODQyNzE3 1. 项目结构 ─src├─main│ ├─java│ │ └─org│ │ └─example│ │ │ KafkaApplication.java│ │ ││ │ └─demo│ │ KafkaConsume…

跟李沐学AI:目标检测、锚框

边缘框 用于表示物体的位置&#xff0c;一个边缘框通过四个数字定义&#xff1a;(坐上x, 左上y, 右下x, 右下y)或&#xff08;左上x, 左上y, 宽, 高&#xff09; 通常物体检测或目标检测的数据集比图片分类的数据集小很多&#xff0c;因为物体检测数据集标注成本高很多。 目…

音视频相关知识

H.264编码格式 音频 PCM就是要把声音从模拟信号转换成数字信号的一种技术&#xff0c;他的原理简单地说就是利用一个固定的频率对模拟信号进行采样。 pcm是无损音频音频文件格式

【Qt】QWidget的font属性

QWidget的font属性 API说明 font() 获取当前 widget 的字体信息. 返回 QFont 对象. setFont(const QFont& font) 设置当前 widget 的字体信息. 关于Qfont 属性说明 family 字体家族. ⽐如 "楷体", "宋体", "微软雅⿊" 等. pointSiz…

“面试通关秘籍:高频题目与算法整理”

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

Postman断言

目录 概述 断言工作原理 常用断言方法 Status code: Code is 200 Status code: Successful POST request Status code: Code name has string Response body: Contains string Response body: JSON value check Response body: ls equal to a string Response headers…

鸿萌数据恢复服务:SQL Server 中的 GAM、SGAM、IAM,及数据库损坏的修复方法

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时&#xff0c;鸿萌是国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商&#xff0c;为专…

开源的数据库增量订阅和消费的中间件——Cancl

目录 工作原理 MySQL主备复制原理 Canal 工作原理 主要功能和特点 应用场景 实验准备 安装JDK11 下载MySQL8.0 配置canal.admin 配置canal-deployer 测试数据读取 新增一台主机用做被同步的目标机器测试 官方地址&#xff1a;https://github.com/alibaba/canal?ta…

极狐 GitLab 依赖扫描:助力开发者管理软件供应链

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

LeetCode.22。括号生成

题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组 输入输出实例&#xff1a; 思路&#xff1a;对于这道题目我们可以用回溯法&#xff0c;创建一个函数backtrack(当前字符&#xff0c;左括…

解锁 Starknet 的深层洞察:利用 Dune 构建动态数据可视化

原文&#xff1a;https://dev.to/lordghostx/queries-to-insights-visualizing-starknet-data-with-dune-j8p 作者&#xff1a;LordGhostX 编译&#xff1a;TinTinLand Starknet 的链上数据为其区块链生态系统提供了丰富的洞察。它为用户活动、交易模式和网络交互提供了全面…

【k8s从节点报错】error: You must be logged in to the server (Unauthorized)

k8s主节点可以获取nodes节点信息&#xff0c;但是从节点无法获取&#xff0c;且报错“error: You must be logged in to the server (Unauthorized)” 排查思路&#xff1a; 当时证书过期了&#xff0c;只处理的主节点的证书过期&#xff0c;没有处理从节点的 kubeadm alpha …

ctfshow-web入门-sql注入(web221、web222、web223)limit 注入与 group 注入

目录 1、web221 2、web222 3、web223 1、web221 limit 注入 分页 sql 格式&#xff1a;select * from table limit (start-1)*pageSize,pageSize; 其中 start 是页码&#xff0c;pageSize 是每页显示的条数。 比如&#xff1a; 查询第1条到第10条的数据的sql是&#xff…

倒计时启动!2024东北医院信息网络大会即将在这里举办!

随着全球医疗行业步入信息化转型的新时代&#xff0c;2024年8月24日至25日&#xff0c;以“科技赋能&#xff0c;重塑未来医疗”为主题的2024东北医院信息网络大会将在长春开曼宴都酒店&#xff08;长春市高新区海外街1号&#xff09;隆重举行。此次大会与国家卫健委、中医药管…

Python青少年简明教程:输入输出

Python青少年简明教程&#xff1a;输入输出 Python的输入输出是编程中的基本操作。Python的标准输入输出主要通过内置的input()函数和print()函数来实现。这两个函数使得从用户那里接收输入和向用户展示输出变得非常简单。 输入&#xff08;Input&#xff09;函数 input()函数…

Denosing RayDN-对同一射线的误检测优化

Denosing操作理解 DN-DETR增加denosing操作&#xff0c;帮助快速拟合&#xff0c;提高了目标检测任务中的效率和精度。通过这种方式&#xff0c;DN-DETR 克服了原始 DETR 的一些限制&#xff0c;使其在实际应用中具有更好的性能和鲁棒性。 GTBoxes通过随机偏移H, L,W进行偏移&…

Nuxt3【路由中间件】middleware

路由中间件类似路由守卫&#xff0c;即在导航到特定路由之前运行一段代码 内联路由中间件 在页面中定义的路由中间件&#xff0c;因没有名称&#xff0c;所以也叫匿名路由中间件 definePageMeta({middleware: [function (to, from) {console.log("执行了内联路由中间件&q…