⚡热点管理模块⚡

Posted 努力学习的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡热点管理模块⚡相关的知识,希望对你有一定的参考价值。

热点管理模块概念

  • 如果一个文件在连续一段时间内没有访问到,则该文件是一个非热点文件,否则位热点文件。
  • 在服务上上有两个目录,一个目录是backdir存储的是热点文件,一个目录是packdir存储的是非热点文件
  • 热点管理模块每隔一段时间都会遍历backdir下的热点文件,如果一个文件在连续一段时间内没有访问到,则说明该文件是一个非热点文件,则热点管理模块会对该文件进行压缩到packdir目录下,删除backdir的热点文件,节省磁盘空间.

实现思路  

成员变量     

  • 热点管理模块需要包含热点时间,热点文件的目录backdir,非热点文件目录packdir,压缩文件后缀等信息  ,这些信息可以从配置文件管理模块中获得。   

成员函数run实现思路

  • 对服务器上的backdir目录下的文件进行检测,哪些文件长时间没有被访问, 则认为为非热点文件。      
  • 如果在热点时间内没有访问过该文件,则认为是非热点文件,压缩原文件,并将压缩文件放入到packdir目录下删除原文件,并利用文件信息管理模块将该文件信息中的压缩标志设置为true,当客户端要下载该文件时,可以直接通过压缩标志判断是否去哪一个目录获取文件数据。
#pragma once                                                                                                                                                                              
  #include"FileInfoManger.hpp"
 namespace sjp
    class HotSpotManger
      private:                                        
        int hot_time;               
        std::string back_dir;//压缩文件目录;
        std::string pack_dir;//备份文件目录;
        std::string pack_file_suffix;
        static std::mutex lock;         
        static HotSpotManger* instant;                                             
        HotSpotManger()                
          hot_time=sjp::Config::GetInstant()->GetHotTime();
          back_dir=sjp::Config::GetInstant()->GetBackDir();
          pack_dir=sjp::Config::GetInstant()->GetPackDir();       
          pack_file_suffix=sjp::Config::GetInstant()->GetPackFileSuffix();
          
                                                       
        HotSpotManger(HotSpotManger&)=delete;
      public:
        //热点文件返回true,非热点文件返沪false 
        static HotSpotManger* GetInstant()
          if(instant==nullptr)
            lock.lock();                               
            if(instant==nullptr)  
              instant=new HotSpotManger();
            
            lock.unlock();
          
          return instant;
        
  
  
        //热点文件返回true
        //非热点文件返回false
        bool JudgeHotspotFile(std::string& backpath)
          sjp::FileUtil fu(backpath);
          time_t atime=fu.GetFileAccessTime();
          time_t curtime=time(NULL);
          if(curtime-atime>hot_time)
            return false;
          
          return true;
        
  
        void Run()
          sjp::FileUtil fu(back_dir.c_str());
          if(!fu.Exist())
          
             fu.CreateDir(back_dir); 
          
  
          while(true)
          std::vector<std::string> arry;                                                                                                                                                    
          fu.GetPathInDir(arry);
          for(int i=0;i<arry.size();i++)
            //获取文件信息
            sjp::FileInfo fileinfo;
            if(!sjp::FileInfoManger::GetInstant()->GetOneByRealPath(arry[i],fileinfo))
           
              //存储文件中没有该文件信息
              fileinfo.AddFileInfo(arry[i]);
              sjp::FileInfoManger::GetInstant()->Insert(fileinfo);
            
            if(!JudgeHotspotFile(fileinfo.back_path))
              /*1.非热点文件进行压缩
               *2.删除源文件
                3.修改文件列表中的信息
               */
              sjp::FileUtil fu(arry[i]);
              std::string packfilepath=pack_dir+fu.GetFilename()+pack_file_suffix; 
              fu.PackFile(packfilepath);
              fu.Remove();
              fileinfo.pack_sign=true; 
              sjp::FileInfoManger::GetInstant()->update(fileinfo);
            
          
          sjp::FileInfoManger::GetInstant()->Storage();
          usleep(1000);
        
        
    ;
  
    sjp::HotSpotManger* HotSpotManger::instant=nullptr;
    std::mutex HotSpotManger::lock;
                                          

以上是关于⚡热点管理模块⚡的主要内容,如果未能解决你的问题,请参考以下文章

ansible-script模块和copy模块

c++实战项目——云备份服务器

c++实战项目——云备份服务器

云备份项目

云备份项目

destoon 如何获取后台模块管理下的id号