云备份项目--服务端编写

文章目录

  • 7. 数据管理模块
    • 7.1 如何设计
    • 7.2 完整的类
  • 8. 热点管理
    • 8.1 如何设计
    • 8.2 完整的类
  • 9. 业务处理模块
    • 9.1 如何设计
    • 9.2 完整的类
    • 9.3 测试
      • 9.3.1 测试展示功能

完整的代码–gitee链接

7. 数据管理模块

TODO: 读写锁?普通锁?

7.1 如何设计

需要管理哪些数据

  • 文件大小
  • 文件最后一次修改时间
  • 文件最后一次访问时间
  • 文件的实际存放路径
  • 文件是否被压缩
  • 文件压缩包存放路径
  • url的资源路径path(URL路径(如http://www.example.com/path/to/file的路径path就是是/path/to/file

如何管理数据

  • 用于数据信息访问:使用哈希表,使用urlPath作为key
  • 使用json序列化将信息保存在文件中
  • 读写锁,为了提高访问效率

7.2 完整的类

/* 文件管理数据模块, 这里有文件的所有信息
, 用到了JsonUtil.hpp, FileUtil.hpp, Config.hpp */#ifndef __MY_DATA_MANGER__
#define __MY_DATA_MANGER__
#include "Config.hpp"
#include <iostream>
#include <unordered_map>
#include <pthread.h>
#include <string>
#include <vector>
#include <mutex>namespace cloud
{
struct BackupInfo
{   // 传入文件名, 初始化结构体BackupInfo(const std::string& fileName);BackupInfo(); // 当前文件的状态是否ok, ok 返回truebool isOk();bool isPacked;              // 文件是否被压缩(true表示被压缩了)size_t fileSz;              // 文件大小time_t lastMTime;           // 文件最后一次修改时间time_t lastATime;           // 文件最后一次访问时间std::string ulFilePath;     // 上传文件存放的路径(这里要精确到哪个路径下哪个文件,如./files/fileName.txt)std::string rarFilePath;    // 压缩文件存放的路径(这里要精确到哪个路径下哪个文件,如./rars/fileName.lz)std::string urlPath;        // url的资源路径pathbool biStatus = true;       // 当前文件的状态是否ok
private:// 构造函数使用该函数bool init(const std::string& fileName);
};class DataManager
{
private:std::unordered_map<std::string, BackupInfo> _hash;       // 通过key:url来映射BackupInfostd::string _backup;                                     // 备份的信息文件的路径pthread_rwlock_t _rwlock;std::mutex _mtx;
public:DataManager();// 将bi添加到哈希表中bool insertInfo(const BackupInfo& bi);// 根据bi修改哈希表中的值bool updateInfo(const BackupInfo& bi); // 通过urlPath获得一个文件信息, 放到info中bool get1FromURL(const std::string& urlPath, BackupInfo* info);// 通过该文件的路径(本地路径)获得文件信息, 放到info中bool get1FromPath(const std::string& path, BackupInfo* info);// 获取所有文件信息, 放到数组中bool getAllInfo(std::vector<BackupInfo>* vBi);// 保存备份文件, 将所有文件的信息保存下来bool strorageBackup();// 加载配置文件, 将其放到_hash中bool loadBackup();
};
}
#endif

8. 热点管理

8.1 如何设计

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

  1. 遍历所有的文件
  2. 检测文件的最后一次访问时间
  3. 与当前时间进行相减得到差值,这个差值如果大于设定好的非热点判断时间则认为是非热点文件,则进行压缩存放到压缩路径中,删除源文件
  4. 修改数据管理模块对应的文件信息(压缩标志–>true)

8.2 完整的类

/* 
热点管理模块, 
检测压缩文件存放的路径中所有的文件是否长时间未访问, 
并做相应的压缩处理。
*/
#ifndef __MY_HOTSPOT__MANAGER__
#define __MY_HOTSPOT__MANAGER__
#include "DataManager.hpp"
#include "Config.hpp"
#include <time.h>
#include <unistd.h>extern cloud::DataManager* dm;
namespace cloud
{
class HotspotManager
{
private:std::string _ulPath;      // 上传文件存放的路径(这里指的是文件夹)std::string _rarPath;     // 压缩文件存放的路径(这里指的是文件夹)std::time_t _hotTime;     // 热点时间
public:HotspotManager();~HotspotManager();// 提供主要功能: 检测是否是热点+非热点删除并压缩+更改配置文件信息bool runHotspotManager();private:// 检测是否是热点文件, 是返回truebool checkHot(const std::string& path);// 将文件压缩到指定位置bool compressAndMov(const std::string& path, cloud::FileUtil& fu);// 删除文件bool removeFile(cloud::FileUtil& fu);// 更新文件的信息, 并进行持久化操作bool updateAndStorage(const std::string& path);
};} #endif

9. 业务处理模块

9.1 如何设计

  1. 搭建网络通信服务器:借助httplib完成
  2. 业务请求处理
    1. 文件上传请求:备份客户端上传的文件,响应上传成功
    2. 文件列表展示请求:客户端浏览器请求一个备份文件的展示页面,响应页面
    3. 文件下载请求:通过展示页面,点击下载,响应客户端要下载的文件数据

前置知识:

ETag:

HTTP中的ETag(Entity Tag)是一个与特定版本的资源相关的标识符。它是一种机制,用于确定客户端缓存的副本是否是最新的。

客户端第一次下载文件的时候,会收到这个响应信息,第二次下载,就会将这个信息发送给服务器,想要让服务器根据这个唯一标识判断
这个资源有没有被修改过,如果没有被修改过,直接使用原先缓存的数据,不用重新下载了

Accept-Ranges:

Accept-Ranges允许客户端在下载过程中恢复中断的下载,或者只下载资源的一部分,这可以提高下载效率,尤其是在处理大文件时。其值设置为bytes表示服务器支持基于字节的请求


断点续传

第一次请求:

  1. 客户端发起 HTTP GET 请求一个文件。
  2. 服务器处理请求,返回文件内容以及相应的 Header,其中包括 Etag(例如:627-4d648041f6b80)(假设服务器支持 Etag 生成并已开启了 Etag)状态码为 200。

第二次请求(断点续传):

  1. 客户端发起 HTTP GET 请求一个文件,同时发送 If-Range(该头的内容就是第一次请求时服务器返回的 Etag:627-4d648041f6b80)。
  2. 服务器判断接收到的 Etag 和计算出来的 Etag 是否匹配,如果匹配,那么响应的状态码为 206;否则,状态码为 200。
请求
GET /download/a.txt http/1.1
Content-Length: 123
If-Range: "⽂件唯⼀标识"		服务端在下载时响应的etag字段”用于服务端判断这个文件与原先下载的文件是否一致
Range: bytes=89-999			这个字段用于告诉服务器客户端需要的数据区间范围响应
HTTP/1.1 206 Partial Content
Content-Length:123
Content-Range: bytes 89-999/100000
Content-Type: application/octet-stream
ETag: "inode-size-mtime⼀个能够唯⼀标识⽂件的数据"
Accept-Ranges: bytes

9.2 完整的类

/* 提供业务处理的功能, 处理来自客户端的各种请求 */
#ifndef __MY_SERVICE__
#define __MY_SERVICE__
#include "DataManager.hpp"
#include "httplib.h"extern cloud::DataManager* dm;         // 用于管理数据namespace cloud
{
class Service
{
private:int _srvPort;                    // 服务器端口号std::string _srvIp;              // 服务器ipstd::string _urlDownPre;         // url下载路径前缀
public:Service();~Service();// 进行业务处理void runService();private:// 处理上传文件static void uploadHandler(const httplib::Request& req, httplib::Response& rsp);// 处理下载文件static void downloadHandler(const httplib::Request& req, httplib::Response& rsp);// 处理显示操作static void listHandler(const httplib::Request& req, httplib::Response& rsp);// 将时间戳转换为可读的static std::string timeToStr(time_t t);// 获取ETag, 文件名-文件大小-最后一次修改时间static std::string getETag(const BackupInfo& bi);
};
}
#endif

9.3 测试

9.3.1 测试展示功能

此时的backup.data如下

[{"fileSz" : 0,"isPacked" : false,"lastATime" : 1735651729,"lastMTime" : 1735651729,"rarFilePath" : "./rars/testtest.txt.lz","ulFilePath" : "./files/testtest.txt","urlPath" : "/download/testtest.txt"},{"fileSz" : 3083,"isPacked" : false,"lastATime" : 1735649756,"lastMTime" : 1735131288,"rarFilePath" : "./rars/Config.hpp.lz","ulFilePath" : "./files/Config.hpp","urlPath" : "/download/Config.hpp"}
]

页面显示如下

image-20241231213014354

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时&#xff0c;【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

Synthesia技术浅析(二):虚拟人物视频生成

Synthesia 的虚拟人物视频生成模块是其核心技术之一&#xff0c;能够将文本输入转换为带有同步语音和口型的虚拟人物视频。该模块如下所示&#xff1a; 1.文本输入处理 2.语音生成&#xff08;TTS, Text-to-Speech&#xff09; 3.口型同步&#xff08;Lip Syncing&#xff0…

[Linux]进程间通信-共享内存与消息队列

目录 一、共享内存 1.共享内存的原理 2.共享内存的接口 命令行 创建共享内存 共享内存的挂接 去掉挂接 共享内存的控制 3.共享内存的使用代码 Comm.hpp--封装了操作接口 客户端--写入端 服务器--读取端 4.管道实现共享内存的同步机制 二、消息队列 1.底层原理 2…

凸包(convex hull)简述

凸包&#xff08;convex hull&#xff09;简述 这里主要介绍二维凸包&#xff0c;二维凸多边形是指所有内角都在 [ 0 , Π ] [0,\Pi ] [0,Π]范围内的简单多边形。 凸包是指在平面上包含所有给定点的最小凸多边形。 数学定义&#xff1a;对于给定集合 X X X&#xff0c;所有…

【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中&#xff0c;提升整体效率是每个企业都渴望达成的目标。首先&#xff0c;优化业务流程是实现高效运行的基础。通过分析目前的流程&#xff0c;找出冗余环节并进行简化&#xff0c;能够帮助企业缩短审批时间&#xff0c;提高客户满…

以太网UDP协议栈实现(支持ARP、ICMP、UDP)--FPGA学习笔记26

纯verilog实现&#xff0c;仅使用锁相环IP、FIFO IP&#xff0c;方便跨平台移植。支持ping指令。 以太网系列文章&#xff1a; 以太网ICMP协议(ping指令)——FPGA学习笔记25-CSDN博客 以太网ARP协议——FPGA学习笔记23-CSDN博客 以太网PHY_MDIO通信&#xff08;基于RTL821…

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:

java项目之校园管理系统的设计与实现(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; springboot校园…

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用&#xff0c;尤其是在需要集成…

打造三甲医院人工智能矩阵新引擎(一):文本大模型篇--基于GPT-4o的探索

一、引言 当今时代,人工智能技术正以前所未有的速度蓬勃发展,深刻且广泛地渗透至各个领域,医疗行业更是这场变革的前沿阵地。在人口老龄化加剧、慢性疾病患病率上升以及人们对健康需求日益增长的大背景下,三甲医院作为医疗体系的核心力量,承担着极为繁重且复杂的医疗任务。…

S7-200采集频率信号

S7-200可以借助高速计数器完成频率信号采集&#xff0c;接入流量计、转速等信号。官方给出的程序块无法完成多路同时采集&#xff0c;需要自己进行修改。 首先下载官方的频率采集库 SIOS 下载后导入library&#xff0c;在library中出现Frequency(v1.0) 拖进ladder后&#xf…

专家混合(MoE)大语言模型:免费的嵌入模型新宠

专家混合&#xff08;MoE&#xff09;大语言模型&#xff1a;免费的嵌入模型新宠 今天&#xff0c;我们深入探讨一种备受瞩目的架构——专家混合&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;大语言模型&#xff0c;它在嵌入模型领域展现出了独特的魅力。 一、M…

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码&#xff1a;ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…

MySQL叶子节点为啥使用双向链表?不使用单向呢?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ MySQL 中的 B 树索引&#x…

用户界面的UML建模10

非正常的可视反馈可伴随着同步事件发生&#xff0c;而同步事件可由系统动作产生。但是&#xff0c;可以分别对它们进行建模。 在下节中将对这些特殊的事件依次进行论述。 6.1 异常处理建模 异常&#xff0c;由Meyer 定义[16],其作为运行时事件&#xff08;run-time events&a…

最新版Chrome浏览器加载ActiveX控件之CFCA安全输入控件

背景 CFCA安全输入控件用于保证用户在浏览器、桌面客户端、移动客户端中输入信息的安全性&#xff0c;防止运行在用户系统上的病毒、木马等恶意程序入侵窃取用户输入的敏感信息。确保用户输入、本地缓存、网络传输整个流程中&#xff0c;输入的敏感信息不被窃取。广泛应用于银行…

0基础跟德姆(dom)一起学AI 自然语言处理10-LSTM模型

1 LSTM介绍 LSTM&#xff08;Long Short-Term Memory&#xff09;也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出门…

力扣283 移动零

void moveZeroes(int* nums, int numsSize) {int last_non_zero_found_at 0;for (int i 0; i < numsSize; i) {if (nums[i] ! 0) {// 交换 nums[last_non_zero_found_at] 和 nums[i]int temp nums[last_non_zero_found_at];nums[last_non_zero_found_at] nums[i];nums[i…

LookingGlass使用

文章目录 背景编译安装运行限制使用场景总结参考 背景 Looking Glass 是一款开源应用程序&#xff0c;可以直接使用显卡直通的windows虚拟机。 常见环境是Linux hostwindows guest&#xff0c;基本部署结构图&#xff1a; 编译 git clone --recursive https://github.com/g…