云备份项目--服务端编写
文章目录
- 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 如何设计
需要完成的功能: 对服务器上备份的文件进行检测,哪些文件长时间没有被访问,则认为是非热点文件,则压缩存储,节省磁盘空间。
- 遍历所有的文件
- 检测文件的最后一次访问时间
- 与当前时间进行相减得到差值,这个差值如果大于设定好的非热点判断时间则认为是非热点文件,则进行压缩存放到压缩路径中,删除源文件
- 修改数据管理模块对应的文件信息(压缩标志–>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 如何设计
- 搭建网络通信服务器:借助httplib完成
- 业务请求处理
- 文件上传请求:备份客户端上传的文件,响应上传成功
- 文件列表展示请求:客户端浏览器请求一个备份文件的展示页面,响应页面
- 文件下载请求:通过展示页面,点击下载,响应客户端要下载的文件数据
前置知识:
ETag:
HTTP中的ETag
(Entity Tag)是一个与特定版本的资源相关的标识符。它是一种机制,用于确定客户端缓存的副本是否是最新的。
客户端第一次下载文件的时候,会收到这个响应信息,第二次下载,就会将这个信息发送给服务器,想要让服务器根据这个唯一标识判断
这个资源有没有被修改过,如果没有被修改过,直接使用原先缓存的数据,不用重新下载了
Accept-Ranges:
Accept-Ranges
允许客户端在下载过程中恢复中断的下载,或者只下载资源的一部分,这可以提高下载效率,尤其是在处理大文件时。其值设置为bytes
表示服务器支持基于字节的请求
断点续传
第一次请求:
- 客户端发起 HTTP GET 请求一个文件。
- 服务器处理请求,返回文件内容以及相应的 Header,其中包括 Etag(例如:627-4d648041f6b80)(假设服务器支持 Etag 生成并已开启了 Etag)状态码为 200。
第二次请求(断点续传):
- 客户端发起 HTTP GET 请求一个文件,同时发送 If-Range(该头的内容就是第一次请求时服务器返回的 Etag:627-4d648041f6b80)。
- 服务器判断接收到的 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"}
]
页面显示如下
相关文章:

云备份项目--服务端编写
文章目录 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 如何设计 需要管理…...

Node.js——fs(文件系统)模块
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

SAP BC 同服务器不同client之间的传输SCC1
源配置client不需要释放 登录目标client SCC1...

CentOS: RPM安装、YUM安装、编译安装(详细解释+实例分析!!!)
目录 1.什么是RPM 1.1 RPM软件包命名格式 1.2RPM功能 1.3查询已安装的软件:rpm -q 查询已安装软件的信息 1.4 挂载:使用硬件(光驱 硬盘 u盘等)的方法(重点!!!) 1…...
linux音视频采集技术: v4l2
简介 在 Linux 系统中,视频设备的支持和管理离不开 V4L2(Video for Linux 2)。作为 Linux 内核的一部分,V4L2 提供了一套统一的接口,允许开发者与视频设备(如摄像头、视频采集卡等)进行交互。无…...

MySQL使用navicat新增触发器
找到要新增触发器的表,然后点击设计,找到触发器标签。 根据实际需要,填写相关内容,操作完毕,点击保存按钮。 在右侧的预览界面,可以看到新生成的触发器脚本...

voice agent实现方案调研
前言 目前语音交互主要的实现大体有两种: 级联方案,指的是,大规模语言模型 (LLM)、文本转语音 (TTS) 和语音转文本 (STT),客户的话通过vad断句到STT的语音转文本,经过大模型进行生成文本,生成文本后通过TTS进行回复给用户。(主流方案)端到端的方案,开发者无需再…...

TCP通信原理学习
TCP三次握手和四次挥手以及为什么_哔哩哔哩_bilibili...
Three.js 基础概念:构建3D世界的核心要素
文章目录 前言一、场景(Scene)二、相机(Camera)三、渲染器(Renderer)四、物体(Object)五、材质(Material)六、几何体(Geometry)七、光…...
如何用代码提交spark任务并且获取任务权柄
在国内说所有可能有些绝对,因为确实有少数大厂技术底蕴确实没的说能做出自己的东西,但其他的至少95%数据中台平台研发方案,都是集群中有一个持久化的程序,来接收任务信息,并向集群提交任务同时获取任务的权柄ÿ…...

关于Mac中的shell
1 MacOS中的shell 介绍: 在 macOS 系统中,Shell 是命令行与系统交互的工具,用于执行命令、运行脚本和管理系统。macOS 提供了多种 Shell,主要包括 bash 和 zsh。在 macOS Catalina(10.15)之前,…...
【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合
文章目录 背景如何使用附上rimraf的介绍和说明主要作用使用场景安装使用示例异步删除同步删除 参考资料 背景 在npm run build时,一般都会清空项目中已有的dist目录再构建,避免新旧混合。 如何使用 可以简单使用rimraf这个npm依赖包。 目前rimraf的最…...

爬虫学习记录
1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…...

Java Spring Boot实现基于URL + IP访问频率限制
点击下载《Java Spring Boot实现基于URL IP访问频率限制(源代码)》 1. 引言 在现代 Web 应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如…...

C4D2025 win版本安装完无法打开,提示请将你的maxon App更新至最新版本,如何解决
最近安装C4D2025 win版本时,明明按步骤安装完成,结果打开提示提示请将你的maxon App更新至最新版本?遇到这种情况该如何解决呢。 一开始我的思路以为是旧版本没有删除干净,所以将电脑里有关maxon的软件插件都卸载了,重…...

微信小程序实现登录注册
文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式: https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…...

SpringBoot环境和Maven配置
SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…...

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术
联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…...

1.07 标准IO
1.思维导图 2.先编写以下结构体 struct Student { char name[20]; double math; double chinese; double english; double physical; double chemical; double…...

恒压恒流原边反馈控制芯片 CRE6289F
CRE6289F 系列产品是一款内置高压 MOS 功率开关管的高性能多模式原边控制的开关电源芯片。较少的外围元器件、较低的系统成本设计出高性能的交直流转换开关电源。CRE6289F 系列产品提供了极为全面和性能优异的智能化保护功能,包括逐周期过流保护、软启动、芯片过温保…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...