源栈培训:ASP.NET MVC-4:性能:Bundle和Cache

更多
2019年08月04日 20点01分 作者:叶飞 修改
Bundle配置

为了减少项目中的js和css文件的传输时间,MVC提供了bundle机制,将其进行

压缩:

  • 去除注释、空格、回车等无用符号
  • 用短变量名取代常变量名

合并:(减少建立连接所需要的时间,尤其是数据量不大但文件多的时候极其有用)

只需要在BundleConfig.RegisterBundles()中进行配置,对js文件和css文件分别使用ScriptBundle和StyleBundle

            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));    //version指同一版本

            bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.validate*"));  //*是通配符

然后在View中使用

    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
最后,仅当项目release的时候才进行bundle,需在web.config中修改:
<compilation debug="false" targetFramework="4.6.1"/>

缺点:因为没有真正生成静态文件,无法使用CDN技术。(直接使用.min)

优点:即时更新(通过后缀v=)实现


最简单的性能提升:缓存


Output Cache

演示:略)

有意思:OutputCache实际上继承自ActionFilterAttribute!

注意:如果缓存被击中(生效),MVC会直接将之前缓存的HTML文件/片段返回给客户端,不会再运行Action和View中的代码(演示:略)

OutputCache的常用属性:

  • Duration:缓存多久
  • VaryByParam:根据Action的参数缓存不同的“副本”
    1. none:不考虑参数,所有参数使用同一个缓存版本
    2. *:考虑所有参数,只要有任何一个参数值不同,都生成一个新的缓存副本
    3. 参数名,比如:"id";多个参数用分号(;)分隔"id;name":按指定的参数缓存副本
  • CacheProfile://TODO:讲web.config配置后……
  • 其他……

ChildAction也可以声明OutputCache,缓存部分页面。

注意理解:Action和ChildAction都缓存时的情景……

但MVC无法解决整个页面缓存其中部分页面不缓存的情况!所以我们需要引入:


Donut Caching

添加引用,建议使用nuget

当不要缓存其中某一个ChildAction,简单添加一个参数:true

@Html.Action("Login", "Account", true)

了解:自定义的Html Helper的用法

也可以在ChildAction上使用:

[DonutOutputCache(CacheProfile = "FiveMins")]
在低版本的MVC(至少MVC3以前)时,ChildAction不能使用CacheProfile,donut同时弥补了这个缺陷


可编程API

在MVC中,Cache使用“键值对”的形式存储,可以很方便的进行增删改查,^_^

        public object Add(
            string key, object value, //键值对
            CacheDependency dependencies, //主要适用于文件,当文件发生变动时,删除当前缓存
            DateTime absoluteExpiration, 
            TimeSpan slidingExpiration, 
            CacheItemPriority priority, //优先级
            CacheItemRemovedCallback onRemoveCallback);//当缓存被删除时调用

Cache是全局的:建议使用{Controller}-{Action}-{Parameters}的形式构建cache key值,以免重复冲突

理解Expiration的两种形式:

  • absolute:绝对过期时间,时间一到,就删除缓存
  • sliding:在最后一次使用时间之后若干时间一直没有使用就删除(类似于session)

其实,飞哥本人是非常喜欢sliding模式的,但可能是因为KISS原则,除了ASP.NET,sliding模式使用得非常少。

API的实际用途:

  • 缓存文章所有评论,供页面以不同格式显示
  • 发布一篇新文章后删除文章列表首页缓存
  • ……


合理使用缓存

(复习:为什么需要缓存?

  • 需要大量资源(I/O和CPU,一定没有内存
  • 可以重复使用

本质上,是空间换时间,此外,还有数据一致性的问题)


性能问题方法论

  1. 天下没有免费的晚餐
  2. no profile,no improvement
  3. 首先优化瓶颈
  4. 避免过早优化、过度优化

作业

  • 将所有非JQuery相关的js文件压缩合并成yz.js
  • 将所有非Bootstrap相关的cs文件压缩合并成yz.cs
  • 将求助/文章/意见建议列表页进行output cache,注意:
    1. 上述列表页面都有分页和过滤筛选参数
    2. 在缓存页上能即时的反映用户的登录情况
    3. 保证发布新的求助/文章/意见建议后跳转到列表首页,能看到新发布的内容
  • 使用cache API缓存求助/文章/意见建议页的评论,策略为sliding,每新发布一条评论,就删除之前的评论集合
源栈培训 ASP.NET 性能
赞: 4 踩: 2

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

ASP.NET


RazorPage

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

其他Web项目

包括WebForm和WebApi

全部
关键字



帮助

反馈