源栈培训: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全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈