数据筛选和API优化

简介:

筛选数据

需求:如果数据库中存在OrderNum相同,且IsDefault不同的记录,那么IsDefault值为0的记录将替换值为1的记录(IsDefault值为1的记录不展示)。

由于查出来的数据不多,100条以内,所以我是直接全部查询到List内存中,然后在内存中进行数据过滤的操作,思来想去都觉得我如下的实现方式很low,但是我一时又没想到好的办法,不知道大家有没有好的办法?

复制代码
            var newList = list.ToList();
            //筛选出哪些排序号有重复
            var orderNumList = newList.GroupBy(g => g.OrderNum).Select(g => new { orderNum = g.Key, count = g.Count() }).Where(g => g.count > 1).Select(s => s.orderNum).ToList();
            var cfList = newList.Where(w => orderNumList.Contains(w.OrderNum)); //获取有重复排序号的记录

            var cfDefaultList = cfList.Where(w => w.IsDefault);  //默认模块记录
            var cfNoDefaultList = cfList.Where(w => w.IsDefault == false); //非默认模块记录

            var intersectedList = from d in cfDefaultList join f in cfNoDefaultList on d.OrderNum equals f.OrderNum where d.IsDefault!= f.IsDefault select d;

            var newIntersectedList = intersectedList.Distinct().ToArray(); //排序号相同,既存在默认记录也存在非默认记录的数据 

                if (newIntersectedList != null && newIntersectedList.Length > 0)
                {
                    for (int i = 0; i < newIntersectedList.Length; i++)
                    {
                        if (newList.Contains(newIntersectedList[i]))
                        {
                            newList.Remove(newIntersectedList[i]);
                        }
                    }
                }
           newList = newList.OrderBy(x => x.OrderNum).ToList();
复制代码

 以上的newList就代码截图中的数据。

优化API接口

有一个API接口经常卡顿,而且很不稳定,快的时候2~3秒,慢的时候10秒去了。

接口需求:根据社区ID获取优惠券记录。

分析:

  • 负责给API接口提供数据的系统中,缺少许多索引,存在许多慢查询视图。
  • 原来的LINQ实现方式是在内存中分页,响应速度太慢。
  • 并发请求的情况下,资源占用。

优化思路:

1、使用缓存

同一个社区的人在同一时间所看到的优惠券记录应该是一样的,而且我们应该允许脏读,我们在12306上面买火车票的时候,经常也会看到显示有票,但是下单又没有了,可能是使用了缓存,那么我们这里其实同样的可以采用缓存来缓解并发问题。

在WebAPI上面加缓存,那么又分为客户端缓存和服务器缓存。而我们知道,在ASP.NET WebForm和ASP.NET MVC中都是有页面输出缓存的,而在WebAPI中默认没有,从NuGet上面下载WebApi.OutputCache.V2,然后再API接口上添加 

[CacheOutput(ClientTimeSpan = 5)]//, ServerTimeSpan = 5

我这里没法直接使用服务器输出缓存,那是因为无法捕获缓存变量参数。因为我们API接口的请求参数是string appParam,字符串类型的,它是一个json对象进过base64位编码,然后再进过url编码生成的字符串。

我们只能解析后,获取社区ID,然后根据社区ID来设置缓存,把社区ID+ pageIndex就作为缓存的Key,考虑到需要缓存的数据量很小,这里我直接使用.NET自带的缓存,引入命名空间:System.Web.Caching;

复制代码
      private static System.Web.Caching.Cache ObjCache = HttpRuntime.Cache;
        /// <summary>
        /// 设置当前指定Key的Cache值,并限定过期时间 
        /// </summary>
        /// <param name="Key">缓存Key</param>
        /// <param name="Obj">缓存的值</param>
        /// <param name="TimeOuts">超时时间(秒)</param>
        public static void SetCacheSeconds(string Key, object Obj, double TimeOuts)
        {
            ObjCache.Insert(Key, Obj, null, System.DateTime.Now.AddSeconds(TimeOuts), TimeSpan.Zero);
        }
        /// <summary>
        /// 获取当前指定Key的Cache值
        /// </summary>
        /// <param name="Key">缓存Key</param>
        /// <returns>缓存的值</returns>
        public static object GetCache(string Key)
        {
            return ObjCache[Key];
        }
复制代码

缓存操作类Cache完整代码如下:

  View Code

修改API接口代码:

复制代码
           #region added by zouqj 2017-3-7
           var result = Util.Cache.GetCache(CommunityID+ pageIndex) as Result<List<GetAvailableCouponsModel>>;
           if (result==null) //不存在则写入缓存
           {
               //组装参数
               Dictionary<string, string> inParams = new Dictionary<string, string>();
               inParams.Add("UserId", userId);
               inParams.Add("PageIndex", pageIndex);
               inParams.Add("PageSize", pageSize);
               inParams.Add("CommunityID", CommunityID+ pageIndex);
...
RequestParam RequestParam = GetRequestParam(methodName, inParams, AuthenticationId); var jsonContent = JsonConvert.SerializeObject(RequestParam); result = DoPost<List<GetAvailableCouponsModel>>(jsonContent, PostUrl); Util.Cache.SetCacheSeconds(CommunityID, result, 10); //写入缓存 } return result;
复制代码

2、改为存储过程实现

因为这个接口的业务逻辑比较复杂,之前的Linq代码写了好长一大串,获取的记录数很多,而且还是在内存中进行分页实现,所以我将原来的LINQ实现代码修改为分页存储过程实现。

存储过程代码如下:

  View Code

这里需要注意的是,存储执行是,先关闭计数,set nocount on;,然后再打开set nocount off;,这样可以提升性能。还有就是使用WITH ( NOLOCK )允许脏读,提升查询效率。

这里遇到一个很诡异的问题,我使用exec sp_executesql @strSql,N'....'的方式来执行是没有问题的,而如果我使用拼接sql的方式,会报错,因为sql字符串被截断了,只截取到了4000个字符长度,即便我把字符串变量长度设置为nvarchar(max)也没用。

分页方式采用Sqlserver2012以上版本才支持的高效方式:offset ... FETCH NEXT ...ROWS ONLY

原来Linq的执行时间测试:

我修改为存储过程之后的执行时间测试:

本文转自邹琼俊博客园博客,原文链接:http://www.cnblogs.com/jiekzou/p/6517880.html,如需转载请自行联系原作者
性能差距非常明显。
相关文章
|
10天前
|
自然语言处理 数据可视化 API
淘宝商品评论 API 接口:深度解析用户评论,优化产品与服务
淘宝是领先的中国电商平台,其API为开发者提供商品信息、交易记录及用户评价等数据访问服务。对于获授权的开发者和商家,可通过申请API权限、获取并解析评论数据来进行情感分析和统计,进而优化产品设计、提升服务质量、增强用户互动及调整营销策略。未授权用户可能受限于数据访问。
|
19天前
|
机器学习/深度学习 缓存 数据处理
《零基础实践深度学习》2.3.3 校验数据有效性 基于飞桨Dataset和DataLoader API完成数据处理
这篇文章详细介绍了在深度学习任务中进行数据处理的步骤,包括数据校验、封装数据读取与处理函数、使用飞桨Dataset和DataLoader API完成数据加载,以及数据增强/增广的方法和实践,旨在确保数据的有效性和提高模型训练效果。
|
9天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
5天前
|
XML JSON API
淘宝京东商品详情数据解析,API接口系列
淘宝商品详情数据包括多个方面,如商品标题、价格、图片、描述、属性、SKU(库存量单位)库存、视频等。这些数据对于买家了解商品详情以及卖家管理商品都至关重要。
|
13天前
|
数据采集 API 开发工具
淘系商品详情数据解析(属性youhui券sku详情图等)API接口开发系列
在电商领域,特别是像淘宝(淘系)这样的平台,商品详情数据对于商家、开发者以及数据分析师来说至关重要。这些数据包括但不限于商品属性、优惠券信息、SKU(Stock Keeping Unit)详情、商品图片、售后保障等。然而,直接访问淘宝的内部API接口通常需要特定的权限和认证,这通常只对淘宝的合作伙伴或内部开发者开放。 不过,对于需要这些数据的第三方开发者或商家,有几种方式可以间接获取或解析淘系商品详情数据: ——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
12天前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
17天前
|
数据挖掘 API 开发者
有哪些日常用的淘系商品详情API接口数据解析
淘系商品详情数据接口提供了丰富的API接口,这些接口允许开发者实时获取淘宝、天猫等平台上商品的详细信息。以下是一些常用的API接口: ——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
17天前
|
数据采集 数据挖掘 API
淘系商品评论数据解析(商品评论API接口系列)
在淘宝平台上,商品评论是消费者购买决策的重要依据,也是商家了解产品反馈、优化服务的重要渠道。然而,淘宝官方并不直接提供公开的API接口用于批量获取商品评论数据,这主要是出于保护用户隐私和防止数据滥用的考虑。不过,我们可以通过一些合法合规的方式和工具来间接获取或分析这些数据。 ——在成长的路上,我们都是同行者。这篇关于评论API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
20天前
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
23天前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
85 1
下一篇
DDNS