当前位置: 首页 > article >正文

【云备份】服务端数据管理模块

21. 服务端工具类实现-文件实用工具类设计

不管是客户端还是服务端,文件的传输备份都涉及到文件的读写,包括数据管理信息的持久化也是如此,因此首先设计封装文件操作类,这个类封装完毕之后,则在任意模块中对文件进行操作时都将变的简单化。

C++17中filesystem手册

/*util.hpp*/
class FileUtil{
	private:
    	std::string _name;
    public:
    	FileUtil(const std::string &name);
    	size_t FileSize();
    	time_t LastATime();
    	time_t LastMTime();
    	std::string FileName();
    	bool GetPosLen(std::string *content, size_t pos, size_t len);
    	bool GetContent(std::string *content);
    	bool SetContent(std::strint *content);
    	bool Compress(const std::string &packname);
    	bool UnCompress(const std::string &filename);
    	bool Exists();
    	bool CreateDirectory();
    	bool ScanDirectory(std::vector<std::string> *arry);
};
22. 服务端工具类实现-Json实用工具类设计
/*util.hpp*/
class JsonUtil{
	public:
		static bool Serialize(const Json::Value &root, std::string *str);
    	static bool UnSerialize(const std::string &str, Json::Value *root);
};
23. 服务端配置信息模块实现-系统配置信息

使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活。

配置信息:

  • 热点判断时间
  • 文件下载URL前缀路径
  • 压缩包后缀名称
  • 上传文件存放路径
  • 压缩文件存放路径
  • 服务端备份信息存放文件
  • 服务器访问IP地址
  • 服务器访问端口
{
    "hot_time" : 30, 
    "server_port" : 9090,
    "server_ip" : "192.168.122.136",
    "url_prefix" : "/download/",
    "arc_suffix" : ".lz",
    "pack_dir" : "./packdir/",
    "back_dir" : "./backdir/",
    "manager_file" : "./back.dat"
}
23. 服务端配置信息模块实现-单例文件配置类设计

使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。

#define CONFIG_FILE "./cloud.conf"

class Config{
    private:
        time_t _hot_time;
    	int _server_port;
    	std::string _server_ip;
        std::string _url_prefix;
        std::string _arc_suffix;
        std::string _pack_dir;
        std::string _back_dir;
        std::string _manager_file;//备份信息的配置管理
    private:
        static std::mutex _mutex;
        static Config *_instance;
        Config();
    public:
        bool ReadConfig(const std::string &filename);
        int GetHotTime();
        int GetServerPort();
        std::string GetServerIp();
        std::string GetURLPrefix();
        std::string GetArcSuffix();
        std::string GetPackDir();
        std::string GetBackDir();
        std::string GetManagerFile();
    public:
    	static Config *GetInstance();
};
24. 服务端模块实现-管理的数据信息
  • 文件实际存储路径
  • 文件是否压缩标志
  • 压缩包存储路径
  • 文件访问URL
  • 文件最后一次修改时间
  • 文件最后一次访问时间
  • 文件大小
25. 服务端数据管理模块实现-如何管理数据
  • 内存中以文件访问URL为key,数据信息结构为val,使用哈希表进行管理,查询速度快。使用url作为key是因为往后客户端浏览器下载文件的时候总是以url作为请求。
  • 采用文件形式对数据进行持久化存储(序列化方式采用json格式或者自定义方式)
26. 服务端数据管理模块实现-数据管理类的设计
/*data.hpp*/
typedef struct BackupInfo{
    int pack_flag;
    time_t mtime;
    time_t atime;
    size_t fsize;
    std::string realpath;
    std::string url;
    std::string packpath;
    bool NewBackupInfo(const std::string &realpath);
}BackupInfo;

class DataManager{
	private:
    	FileUtil _backup_file;
    	pthread_rwlock_t _rwlock;
    	std::unordered_map<std::string, BackupInfo> _table;
    public:
    	DataManager();
    	bool InitLoad();//初始化程序运行时从文件读取数据
    	bool Storage(); //每次有信息改变则需要持久化存储一次
    	bool Insert(const std::string &key, const BackupInfo &val);
    	bool Update(const std::string &key, const BackupInfo &val);
    	bool GetOneByURL(const std::string &key, BackupInfo *info);
    	bool GetOneByRealPath(const std::string &key, BackupInfo *info);
    	bool GetAll(std::vector<BackupInfo> *arry);
};
27. 服务端数据管理模块实现-数据管理类的测试验证
/*cloud.cpp*/
void DataTest();
int main()
{
	return 0;
}

http://www.kler.cn/a/156831.html

相关文章:

  • flutter 发版的时候设置版本号
  • Spring Boot 2.x 和 Druid 多数据源整合 dm
  • 树形dp总结
  • 【数据结构与算法】第11课—数据结构之选择排序和交换排序
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • Chrome使用IE内核
  • 不瞒各位,不安装软件也能操作Xmind文档
  • 141. 环形链表
  • 食品行业研究:中国板栗市场种植前景及产量分析
  • 不修改数据库更换WordPress域名
  • 机器学习——支持向量机(SVM)
  • 支持PDF文档开发处理,Aspose.PDF升级至最新23.11,一起来看
  • 【C++】STL简介(了解)【STL的概念,STL的历史缘由,STL六大组件、STL的重要性、以及如何学习STL、STL的缺陷的讲解】
  • YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?
  • 开启全新消费革命——消费增值,让每一笔消费变成财富!
  • CVE-2016-2510CVE-2017-5586 BeanShell漏洞
  • 网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码
  • 【ACM独立出版、确定的ISBN号】第三届密码学、网络安全和通信技术国际会议(CNSCT 2024)
  • git 提交文件过大 解决办法
  • 【C++】赋值运算符重载
  • Java中线程池相关的七个参数
  • 22、为什么是卷积?
  • 二叉树题目:二叉树的完全性检验
  • 浅谈安科瑞无线测温设备在挪威某项目的应用
  • Jupiter notebook使用
  • 力扣3题 无重复字符的最长子串 双指针(滑动窗口)