处理160万图片数据冗余

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

问题是这样的,网站现在又很多图片在服务器上,但是这些图片真正是不用的,造成这种情况的原因是,比如在发布一篇博客的时候,你上传了一张图片,但是这篇博客你并没有发表,图片已经在服务器上了,这样,这张图片就永远不会用到,造成数据冗余

图片这样处理的,有专门的图片服务器存放图片,路径在redis服务器上,通过guid在redis服务器上获取的图片路径

任务是,整理出那些guid在redis上有无数据,那些在图片服务器上有无数据,还有就是那些在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服务器(虚拟机)



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值