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

存储系统01——存储系统框架

存储系统

  • 存储系统框架
  • 存储系统模块
  • 存储系统调用过程

存储系统框架

存储系统包括:配置信息config、存储管理datamanager、服务器service

在这里插入图片描述

存储系统模块

  1. 配置信息模块config
    根据storage.conf文件中对应字段内容进行解析,包含:IP、端口号、存储路径、已存储文件信息info等;
{"server_port" : 8081,"server_ip" : " ", "download_prefix" : "/download/",  //文件下载的前缀,即url中将包含该字符串,如/download/index.html"deep_storage_dir" : "./deep_storage/",  # 压缩存储的路径 "low_storage_dir" : "./low_storage/", # 普通存储的路径"bundle_format":4,  #压缩存储的文件类型,由选择的压缩格式确定"storage_info" : "./storage.data"  #已存储文件的信息
}

config通过读取.conf文件的配置信息,并保存在Config类中;该模块使用懒汉单例模式,通过static Config *GetInstance()获取全局唯一单例,并提供多个get接口获取config信息。
GetInstance()使用双重检查锁定(Double-Checked Locking),避免每次访问资源时都进行加锁操作,降低锁带来的性能开销。

public:// 获取单例类对象static Config *GetInstance(){if (_instance == nullptr){_mutex.lock();if (_instance == nullptr){_instance = new Config();}_mutex.unlock();}return _instance;}
  1. 存储管理模块datamanager
    存储管理模块实现了一个DataManager类,用于管理存储文件storage_info的属性信息,包含:初始化读取Get*()、插入Insert()、更新Update()等功能;
    管理的StorageInfo信息为以下结构体内容:
    (永久化保存的.data文件为JSON格式,读取、保存操作前需要进行序列化、反序列化)
typedef struct StorageInfo{                   time_t mtime_;              // 文件的最后修改时间time_t atime_;              // 文件的最后访问时间size_t fsize_;              // 文件的大小std::string storage_path_; // 文件存储路径std::string url_;          // 请求URL中的资源路径bool NewStorageInfo(const std::string &storage_path){.........mtime_ = f.LastAccessTime();atime_ = f.LastModifyTime();fsize_ = f.FileSize();storage_path_ = storage_path;storage::Config *config = storage::Config::GetInstance();........return true;}} StorageInfo;

初始化DataManager类时,调用InitLoad()从文件读取数据并进行反序列化;

DataManager类使用哈希表table_管理存储信息;哈希表key = URL、value = StorageInfo结构体

std::unordered_map<std::string, StorageInfo> table_;
  1. 服务端http通信模块service
    服务端http通信模块是基于libevent库的一个服务器,通过在libevent中注册一个事件evhttp_new后进行事件循环dispatch,当事件触发后,通过在回调函数GenHandler中判断请求并执行对应业务;

整个事件启动伪代码如下:

// 初始化环境
event_base *base = event_base_new();
...
// http 服务器,创建evhttp上下文
evhttp *httpd = evhttp_new(base);
...
// 设定回调函数
evhttp_set_gencb(httpd, GenHandler, NULL);
...
// 启动事件循环,开始处理事件
event_base_dispatch(base)
...

存储系统调用过程

服务器启动过程:

  1. 首先实例化DataManager类,获取已经存储的文件信息列表;
  2. 实例化service类,调用RunMoudle()函数启动服务器(evhttp事件循环);
  3. 客户端建立连接后,服务端根据不同请求(upload、download、showlist)触发事件的回调函数执行不同的任务。

(用户刷新前端界面时,后端返回新的index.html中的文件内容给浏览器)

http://www.xdnf.cn/news/7082.html

相关文章:

  • C++ 蓝桥 STEMA 真题模拟测试卷一(选择题)
  • Diffusion模型入门指南:从零开始理解AI图像生成
  • 数字化转型- 数字化转型路线和推进
  • 刘家祎双剧收官见证蜕变,诠释多面人生
  • 记录:echarts实现tooltip的某个数据常显和恢复
  • 哈希表(2):
  • 校园导游大模型介绍
  • 微积分基本规则及示例解析
  • 【爬虫】DrissionPage-5
  • 第九届御网杯大赛赛题资源加解题思路
  • 手撕I2C和SPI协议实现
  • 豆粕ETF投资逻辑整理归纳-20250511
  • Centos7.9同步外网yum源至内网
  • 山东大学计算机图形学期末复习9——CG12上
  • 【部署】读取excel批量导入dify的QA知识库
  • 【Changer解码头详解及融入neck层数据的实验设计】
  • Fidder基本操作
  • Spring Initializr快速创建项目案例
  • Spark,连接MySQL数据库,添加数据,读取数据
  • Foupk3systemX5OS邮箱上线通知
  • Cadence Allegro安装教程及指导
  • Almalinux中出现ens33 ethernet 未托管 -- lo loopback 未托管 --如何处理:
  • JWT令牌验证
  • 45、简述web.config⽂件中的重要节点
  • Leaflet使用SVG创建动态Legend
  • 文件读取漏洞路径与防御总结
  • AI日报 - 2024年5月17日
  • PyTorch实现三元组损失Triplet Loss
  • 风控域——风控决策引擎系统设计
  • 考研数学微分学(第三,四,五,六,七讲)