zoukankan      html  css  js  c++  java
  • 处理160万图片数据冗余

    晚上睡不着就想起老大的任务,整理出160多万的server冗余数据

    问题是这种,站点如今又非常多图片在server上,可是这些图片真正是不用的,造成这种情况的原因是,比方在公布一篇博客的时候,你上传了一张图片,可是这篇博客你并没有发表,图片已经在server上了,这样,这张图片就永远不会用到,造成数据冗余

    图片这样处理的,有专门的图片server存放图片,路径在redisserver上,通过guid在redisserver上获取的图片路径

    任务是,整理出那些guid在redis上有无数据,那些在图片server上有无数据,还有就是那些在redis上有,可是没用到的(也就是数据库里没有的)

    我的思路是,先定义一个实体类有例如以下属性:

       public Boolean IsRedis { get; set; }
       public Boolean IsSqlServer { get; set; }
       public Boolean IsLocal { get; set; }
    事实上就是对guid做一个标记,比方说redis上有那么就把IsRedis 标记为TRUE;数据库有就把issqlserver标记为TRUE,同理local就是图片服务器上的

    先拿到redis的全部key也就是guid然后遍历,并用key做键,实体吧isredis设为TRUE之后做value存到键值对集合中,对数据库也是相同的操作,

    处理完之后再把数据提交到数据库,提交数据库是用批量提交的,10w条提交一次

       Dictionary<string, Class1> dic = new Dictionary<string, Class1>();
                List<string> list = new Redis().Get();
                foreach (string s in list)
                {
                    if (dic.ContainsKey(s))
                    {
                        dic[s].IsRedis = true;
                    }
                    else
                    {
                        dic.Add(s, new Class1() { IsRedis = true });
                    }
                }
                using (DataTable table = new SQl().Get())
                {
                    foreach (DataRow r in table.Rows)
                    {
                        string s = r["guid"].ToString();
                        if (dic.ContainsKey(s))
                        {
                            dic[s].IsSqlServer = true;
                        }
                        else
                        {
                            dic.Add(s, new Class1() { IsSqlServer = true });
                        }
                    }
                }
    
                //提交数据库
                using (DataTable table = new DataTable())
                {
                    table.Columns.Add("Guid");
                    table.Columns.Add("IsRedis");
                    table.Columns.Add("IsSqlServer");
                    foreach (KeyValuePair<string, Class1> pair in dic)
                    {
                        table.Rows.Add(new object[] { pair.Key, pair.Value.IsRedis, pair.Value.IsSqlServer });
                        if (table.Rows.Count > 100000)
                        {
                            SQl sQl = new SQl();
                            sQl.Submit(table);
                            table.Rows.Clear();
                        }
                    }
                    SQl sQl1 = new SQl();
                    sQl1.Submit(table);
                    table.Rows.Clear();
                }

    就是这样,我是先做了一个測试,总共耗时51m,终于提交到数据库的数据是2201341条数据

    測试环境 SqlServer2012  vs13 server2012服务器(虚拟机)



  • 相关阅读:
    DB-概念-同义词:同义词/Synonym
    DB-概念-数据库:数据库/Database
    DB:目录
    信息安全-OAuth2.0:NuGetFromMicrosoft
    资源-DotNet-站点:DotNet 站点列表
    Nuget-Swagger-Swashbuckle:Swashbuckle
    Nuget-Doc:Nuget 简介
    Nuget-Doc:NuGet 介绍
    术语-Portal:Portal(Web站点)
    cocos2d-html5模板分析
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4388197.html
Copyright © 2011-2022 走看看