最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用、配置上也相当的简单,但通常都能大大提高应用程序的性能,希望对大家有用。
一、缓存
为了避免每次请求都去访问后台的资源,我们一般会考虑将一些更新不是很频繁的,可以重用的数据,通过一定的方式临时地保存起来,后续的请求根据情况可以直接访问这些保存起来的数据,这种机制就是所谓的缓存机制。缓存分为页面输出缓存,内存数据缓存和缓存依赖等。从设计原则来说,易变性、敏感性的信息不适合进行缓存,同时缓存的内容也是易丢失的,在代码中不能完全依赖于缓存的数据,需要保证在缓存的数据丢失后也能进行正确的处理。
1、页面输出缓存
通过对输出的页面进行缓存,每次新的用户请求调用相同的 Action 时,相同的内容不需要重新创建一次而直接输出。页面输出缓存的使用非常简单,在 Action 上使用 [OutputCache] 特性标记即可生效。页面输出缓存可控制缓存的内容所存储的位置,例如是在服务器端存储缓存的页面内容还是在客户端存储缓存的页面内容;也可使用 Duration 参数控制缓存的失效绝对时间和间隔时间,甚至能使用 VaryByParam 参数对不同的请求参数分别进行缓存。页面输出缓存非常适合于内容比较固定的前端页面的缓存。
2、内存数据缓存
通常情况下,数据是保存在数据库、磁盘文件等存储介质中的,而应用程序访问这些资源是一项很费时的操作。如果先将这些资源中的数据缓存到内存缓存区中,当应用程序需要这些数据时,直接从缓存区中提取,就可以减少系统开销,显著提高可使用的用户并发数等。内存数据缓存需考虑缓存的内容更改失效后如何清空其他已经被缓存的相关联的数据问题。
3、EFCache
众所周知,NHiberate 提供了二级缓存功能。现在,如果你使用的是 Entity Framework 6 或更高版本的 Entity Framework ,你也可考虑使用 EFCache 组件来为 Entity Framework 提供二级缓存支持,其实质上也是属于内存数据缓存。EFCache 的特点是使用上非常方便,仅需定义如下的代码无需其他复杂的额外的配置即可实现二级缓存。如需定义特定的缓存策略,如缓存的过期时间,控制数据缓存的范围,也仅需继承 CachingPolicy 类并 override 其部分方法即可。你甚至可以通过实现 ICache 接口来实现自定义的缓存模型以替换默认的 InMemoryCache 。
经测试,使用 EFCache 后,通常性能的提升均是显而易见的。其参考代码如下:
1 /// <summary> 2 /// EF二级缓存配置,如无需二级缓存请注释如下类定义 3 /// </summary> 4 public class Configuration : DbConfiguration 5 { 6 private static InMemoryCache _cache = new InMemoryCache(); 7 public Configuration() 8 { 9 var transactionHandler = new CacheTransactionHandler(_cache); 10 11 AddInterceptor(transactionHandler); 12 13 var cachingPolicy = new CachingPolicy(); 14 15 Loaded += 16 (sender, args) => args.ReplaceService<DbProviderServices>( 17 (s, _) => new CachingProviderServices(s, transactionHandler, 18 cachingPolicy)); 19 } 20 public static void ClearCache() 21 { 22 _cache.Purge(); 23 } 24 }
二、Stream压缩
对响应流进行压缩,其作用是减少网络开销,提高系统的响应速度。目前的浏览器通常都支持 gzip 和 deflate 压缩解压功能,因此你通常无效考虑浏览器的兼容性问题。启用 gzip 和 deflate ,既可通过 IIS 配置实现,在 MVC 中也可通过编写自定义的 ActionFilter 实现。在压缩之前和压缩之后 Stream 的大小差异通常都是惊人的,其压缩率通常都在5-10倍以上。
具体可看看如下的监视数据:
三、js和css文件的压缩和打包
1、js 和 css 文件的压缩
其实质就是生成较小的文件,减小下载这些文件的网络开销,提供系统的响应速度。压缩 js 和 css 文件还有个好处是通常还可以起到代码混淆的作用。在 YbSoftwareFactory 的 MVC 解决方案中,使用的是 Microsoft Ajax Minifier 组件,可在代码编译的过程中自动对所配置的 js 和 css 进行压缩,基本上文件的大小都可减少一半以上:
在 YbSoftwareFactory 的 MVC 解决方案中,巧妙使用了条件编译符号,可在 Debug 模式下使用未压缩的版本以方便调试,在 Release 模式下则可自动切换至对已压缩文件的引用,并通过 Microsoft Ajax Minifier 生成最新的被压缩后的文件版本,对于程序的开发和部署均非常的方便,例如下面的代码:
1 @{ 2 ViewBag.Title = "产品"; 3 ViewBag.AllowEdit = true; 4 ViewBag.AdminJsUrl = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE 5 ? @Url.Content("~/Scripts/Admin/Products/Index.min.js") 6 : @Url.Content("~/Scripts/Admin/Products/Index.js"); 7 var commonJs = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE 8 ? @Url.Content("~/Scripts/Admin/Products/_Common.min.js") 9 : @Url.Content("~/Scripts/Admin/Products/_Common.js"); 10 }
2、js、css文件的打包
其目的是进行 js 文件和 css 文件的合并,当前主流浏览器的并发连接数默认情况下通常都是 6 个,如果前端页面同时请求的服务器资源(如 img 文件、js 文件、css 文件以及各类 url 请求等)超过6个,通常就需要进行排队下载。进行 js 文件、css 文件的打包合并,通常可以在一次请求中就完成未打包之前需多次请求才能完成的工作,通过减少前端浏览器的连接请求,在某种意义上也是可提高系统的响应速度的。js、css 文件的打包通常可以使用 MVC 自带的 Bundle 功能,也可使用某些专用的打包工具,具体不再详细描述。
如需了解更多请点击:权限模型+流程专家 Demo