【lesson5】服务端数据管理模块实现

要管理的数据信息

文件实际存储路径
文件是否压缩标志
压缩包存储路径
文件访问URL
文件最后一次修改时间
文件最后一次访问时间
文件大小

管理数据的方式

内存中以文件访问URL为key,数据信息结构为val,使用哈希表进行管理,查询速度快。使用url作为key是因为往后客户端浏览器下载文件的时候总是以 url 作为请求。
采用文件形式对数据进行持久化存储(序列化方式采用 json 格式或者自定义方式)

数据管理类的实现

数据信息设计成结构体

struct BackupInfo
{
    bool pack_flag;//文件压缩标志位
    size_t file_size;//文件大小
    time_t modify_time;//最后一次修改时间
    time_t access_time;//最后一次访问时间
    std::string real_path;//文件真实路径
    std::string pack_path;//文件压缩路径
    std::string url;//文件的url

    bool NewBackupInfo(const std::string& filepath)
    {
        //std::cout << filepath << std::endl;
        //1.获取文件内容
        fileUtil fu(filepath);
        if(fu.exists() == false)
        {
            std::cout << "NewBackupInfo fail" << std::endl;
            return false;
        }

		//2.设置文件内容信息到类中
        pack_flag = false;
        //std::cout << fu.fileSize() << std::endl;
        file_size = fu.fileSize();
        modify_time = fu.lastModifyTime();
        access_time = fu.lastAccessTime();
        real_path = filepath;

        Config* f = Config::getIstance();
        std::string packdir = f->getPackDir();
        std::string packfile_suffix = f->getPackfileSuffix();
        pack_path = packdir + fu.fileName() + packfile_suffix;

        std::string download_prefix = f->getDownloadPrefix();
        url = download_prefix + fu.fileName();
        return true;
    }
};

数据管理类

成员变量

private:
    std::string _backup_file;//备份文件信息的文件名
    pthread_rwlock_t _rwlock;//读写锁
    std::unordered_map<std::string, BackupInfo> _table;//保存文件信息的哈希表

成员函数

dataManager()
{
    _backup_file = Config::getIstance()->getBackupFile();//获取备份信息文件
    pthread_rwlock_init(&_rwlock, nullptr);//初始化读写锁
    initLoad();//初始化程序运行时从文件读取数据
}
bool initLoad()//初始化程序运行时从文件读取数据
{}
bool storage() //每次有信息改变则需要持久化存储到文件中
{}
bool insert(const BackupInfo& Info)//插入数据
{}
bool update(const BackupInfo& Info)//更新数据
{}
bool getBifoByUrl(const std::string& url, BackupInfo* Info)//根据Url获取数据
{}
bool getBifoByRealPath(const std::string& realPath, BackupInfo* Info)//根据RealPath获取数据
{}
bool getAll(std::vector<BackupInfo> *arry)//获取所有备份信息
{}
~dataManager()
{
    pthread_rwlock_destroy(&_rwlock);//销毁读写锁
}
增查改+获取
insert
bool insert(const BackupInfo& Info)
{
	//存在多执行流同时访问的可能,所以需要加锁
    pthread_rwlock_wrlock(&_rwlock);
    _table[Info.url] = Info;
    pthread_rwlock_unlock(&_rwlock);
    storage();//持久化存储

    return true;
}
update
bool update(const BackupInfo& Info)
{
	//存在多执行流同时访问的可能,所以需要加锁
    pthread_rwlock_wrlock(&_rwlock);
    _table[Info.url] = Info;
    pthread_rwlock_unlock(&_rwlock);
    storage();//持久化存储

    return true;
}
getBifoByUrl
bool getBifoByUrl(const std::string& url, BackupInfo* Info)
{
    //存在多执行流同时访问的可能,所以需要加锁
    pthread_rwlock_wrlock(&_rwlock);
    auto ret = _table.find(url);
    if(ret == _table.end())
    {
        pthread_rwlock_unlock(&_rwlock);
        return false;
    }

    *Info = ret->second;
    pthread_rwlock_unlock(&_rwlock);
    return true;

}
getBifoByRealPath
bool getBifoByRealPath(const std::string& realPath, BackupInfo* Info)
{
	//存在多执行流同时访问的可能,所以需要加锁
    pthread_rwlock_wrlock(&_rwlock);
    for(auto& e : _table)
    {
        if(e.second.real_path == realPath)
        {
            *Info = e.second;
            pthread_rwlock_unlock(&_rwlock);
            return true;
        }
    }

    pthread_rwlock_unlock(&_rwlock);
    return false;
}
getAll
bool getAll(std::vector<BackupInfo> *arry)
{
	//存在多执行流同时访问的可能,所以需要加锁
    pthread_rwlock_wrlock(&_rwlock);
    for(auto& e : _table)
    {
        arry->push_back(e.second);
    }
    pthread_rwlock_unlock(&_rwlock);

    return true;
}
持久化存储和加载信息
initLoad
bool initLoad()//初始化程序运行时从文件读取数据
{
	//1.读取文件内容
    fileUtil fu(_backup_file);
    if(fu.exists() == false)
    {
        return true;
    }

    std::string body;
    bool ret = fu.getContent(&body);
    if(ret == false)
    {
        std::cout << "InitLoad getContent failed" << std::endl;
        return false;
    }
    
	//2.对文件内容进行反序列化
    Json::Value root;
    ret = JsonUtil::UnSerialize(body, &root);
    if(ret == false)
    {
        std::cout << "InitLoad getContent failed" << std::endl;
        return false;
    }
	
	//3.增加所有文件信息到哈希表中
    for(int i = 0; i < root.size(); i++)
    {
        BackupInfo info;
        info.pack_flag = root[i]["pack_flag"].asBool();
        info.file_size = root[i]["file_size"].asInt64();
        info.modify_time = root[i]["modify_time"].asInt64();
        info.access_time = root[i]["access_time"].asInt64();
        info.real_path = root[i]["real_path"].asString();
        info.pack_path = root[i]["pack_path"].asString();
        info.url = root[i]["url"].asString();

        //_table[info.url] = info;
        insert(info);
    } 

    return true;
}
storage
bool storage() //每次有信息改变则需要持久化存储一次
{
	//1.获取所有文件信息进行序列化
    Json::Value root;
    for(auto& e : _table)
    {
        Json::Value tmp;
        tmp["pack_flag"] = e.second.pack_flag;
        tmp["file_size"] = (Json::Int64)e.second.file_size;
        tmp["modify_time"] = (Json::Int64)e.second.modify_time;
        tmp["access_time"] = (Json::Int64)e.second.access_time;
        tmp["real_path"] = e.second.real_path;
        tmp["pack_path"] = e.second.pack_path;
        tmp["url"] = e.second.url;

        root.append(tmp);
    }
	
	//2.对所有信息数据进行序列化
    std::string body;
    bool ret = JsonUtil::Serialize(root, &body);
    if(ret == false)
    {
        std::cout << "Storage Serialize faile" << std::endl;
        return false;
    }
	
	//3.信息数据写入到文件中
    fileUtil fu(_backup_file);
    ret = fu.setContent(body);
    if(ret == false)
    {
        std::cout << "Storage setContent faile" << std::endl;
        return false;
    }

    return true;
}
  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
预处理是数据分析中非常重要的步骤,它是为了准确分析数据而对数据进行的一系列操作。对于lesson数据进行预处理的目的是为了优化数据的质量、可用性和可靠性,以便更好地支持后续的数据分析工作。下面我将从数据清洗、数据规范化、数据转换、数据集成四个方面说明如何对lesson数据进行预处理。 首先是数据清洗,这是预处理的第一个步骤。数据清洗的目的是识别和处理数据中的错误、不一致、重复和缺失等问题,使得数据能够精确无误地支持后续的分析工作。对于lesson数据,我们可以通过删除重复值、填充缺失值、调整不一致的数据格式等方式进行数据清洗。 其次是数据规范化,这是为了处理数据的格式和范围,使得数据更加一致性和可比性。对于lesson数据,我们可以进行数据标准化,如将日期格式统一为YYYY-MM-DD,将文本内容转化为小写或大写等等。 然后是数据转换,这是为了将数据从原始格式转化为适合分析的格式。对于lesson数据,我们可以进行数据转换,如将非数值数据转换为数值数据,对数据进行分类或聚类,进行分箱等等。 最后是数据集成,这是为了将多个数据集合并成一个更大、更全面和更一致的数据集。对于lesson数据,我们可以将不同的数据源集成,比如将学生的成绩、出勤记录、课程评价等数据集成在一起,以进行更全面的数据分析和挖掘。 综上所述,通过数据清洗、数据规范化、数据转换、数据集成等多方面预处理操作,我们可以提高lesson数据的质量、可用性和可靠性,为后续的数据分析工作提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值