数据筛选和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,如需转载请自行联系原作者
性能差距非常明显。
相关文章
|
4天前
|
存储 供应链 监控
1688商品数据实战:API搜索接口开发与供应链分析应用
本文详细介绍了如何通过1688开放API实现商品数据的获取与应用,涵盖接入准备、签名流程、数据解析存储及商业化场景。开发者可完成智能选品、价格监控和供应商评级等功能,同时提供代码示例与问题解决方案,确保法律合规与数据安全。适合企业开发者快速构建供应链管理系统。
|
16天前
|
人工智能 自然语言处理 前端开发
【2025.3.08更新】Linkreate wordpressAI智能插件|自动生成SEO文章/图片/视频+长尾词优化 内置DeepSeek多模型支持与API扩展
Linkreate WordPress AI插件提供强大的自动化文章生成、SEO优化、关键词管理和内容采集功能。它能根据关键词自动生成高质量文章,支持多语言和批量生成,内置长尾关键词生成工具,并可定时自动发布文章。插件还集成了多种AI服务,支持前端AI客服窗口及媒体生成,帮助用户高效管理网站内容,提升SEO效果。
|
22天前
|
JSON API 数据格式
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
|
20天前
|
人工智能 自然语言处理 前端开发
Linkreate wordpressAI智能插件|自动生成SEO文章/图片/视频+长尾词优化 内置DeepSeek多模型支持与API扩展
Linkreate WordPress AI插件提供强大的文章生成与优化功能,支持自动化生成高质量文章、批量生成、SEO优化及双标题定制。关键词生成管理方面,可批量生成长尾关键词并自定义参数。内容采集功能支持单篇和批量采集指定网站内容,可视化规则生成器方便使用。定时任务实现全自动文章生成,24小时稳定运行。API集成兼容多种AI服务,如DeepSeek、OpenAI等,并支持前端AI客服窗口。媒体生成功能包括自动为文章生成图片和短视频,提升内容丰富度。官网提供插件演示及下载:[https://idc.xymww.com/](https://idc.xymww.com/)
|
10天前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
20天前
|
数据可视化 JavaScript 前端开发
利用Postman和Apipost进行API测试的实践与优化-动态参数
在API测试中,Postman和Apipost是常用的工具。Postman内置变量功能有限,面对复杂场景时需编写JavaScript脚本,增加了维护成本。而Apipost提供丰富的内置变量、可视化动态值配置和低代码操作,支持生成真实随机数据,如邮箱、手机号等,显著提升测试效率和灵活性。对于复杂测试场景,Apipost是更好的选择,能有效降低开发与维护成本,提高测试工作的便捷性和可维护性。
|
13天前
|
数据采集 消息中间件 API
微店API开发全攻略:解锁电商数据与业务自动化的核心能力
微店开放平台提供覆盖商品、订单、用户、营销、物流五大核心模块的API接口,支持企业快速构建电商中台系统。其API体系具备模块化设计、双重认证机制、高并发支持和数据隔离等特性。文档详细解析了商品管理、订单处理、营销工具等核心接口功能,并提供实战代码示例。同时,介绍了企业级整合方案设计,如订单全链路自动化和商品数据中台架构,以及性能优化与稳定性保障措施。最后,针对高频问题提供了排查指南,帮助开发者高效利用API实现电商数智化转型。适合中高级开发者阅读。
|
19天前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
10天前
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
12天前
|
存储 前端开发 安全
如何在自己的网站接入API接口获取数据?分步指南与实战示例
将第三方API(如微店API)接入网站是扩展功能和获取实时数据的关键。流程包括注册开发者账号、申请API权限、设置认证机制(OAuth 2.0或AppKey签名)、调用API实现前后端协作、处理数据与错误、优化安全性能,并解决常见问题。确保遵循最佳实践,保障系统稳定与安全。通过这些步骤,开发者可高效整合数据,提升应用功能。