我有一个在ASP.Net MVC中工作的电子商务。 我正在使用缓存来改善页面性能,并且正在运行。

我想知道什么可以提供更好的性能,例如,我可以在视图中设置OutputCache并在所有页面上使用此缓存, 或者可以将控制器中的产品列表放入缓存中(如下面的代码)并将其发送到View为用户呈现?

private IEnumerable<Products> GetProductsCache(string key, ProductType type)
        {
            if (HttpContext.Cache[key] == null)
                HttpContext.Cache.Insert(key, ProductRepository.GetProducts(type), null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration);

            return (IEnumerable<Products>)HttpContext.Cache[key];
        }

public ActionResult Index()
        {
            var home = new HomeViewModel()
                           {
                               Products = GetProductsCache("ProductHomeCache", ProductType.Product)
                               Services = GetProductsCache("ServiceHomeCache", ProductType.Service)
                           };

            return View(home);
        }

两者都有效,但是我想知道哪种是提高性能的首选方法,或者还有其他更好的方法吗?

#1楼 票数:2

在您的示例中,正如Ivan指出的那样,在性能上,输出缓存会稍微好一点。 但只有一点点。

根据我的经验,大多数性能提升来自数据缓存。 页面处理是一个相对便宜的操作,但是数据库调用不是。 因此,我总是gzip并将数据转储到高速缓存中,当我从高速缓存中获取数据时会膨胀。 如果您感兴趣,Hanselman会提供一个很好的压缩缓存示例: http : //www.hanselman.com/blog/CommentView.aspx? guid=aa479008-3d1e-45fc-b89f-e9c2ffc199c1

此外,在mvc中进行输出缓存可能会有些棘手。 要缓存整个页面是可以的,只需使用[OutputCache]属性。 但是,如果只想缓存部分数据(大部分时间是这样做的),则它会变得有些复杂。

希望缓存是MS在mvc 3中可以改善的东西。

#2楼 票数:1

OutputCache将提供更好的结果。 但是并非总是可以使用-例如,如果您有许多动态(特定于用户的)控件。

许多视图中使用结果集时,也可以选择缓存结果。 您当前的实现不是缓存安全的-即,如果两个或多个线程同时进入if中,那么在保存结果时哪个会赢? 如果您选择这种方式,请使用ReaderWriterLockSlim保护您的缓存。

选择缓存时间时也要小心! 我建议您构建具有缓存能力的应用程序,但不要缓存,除非完全确定需要花费很多时间执行(可能需要改进您的方法?)。 项目准备就绪后,对其进行概要分析,然后将缓存放在仅需要的位置!

但我建议您先进行调查-即在给定情况下哪种方法对您更有效。 不要过度使用一个,也不要过度使用两个!

#3楼 票数:1 已采纳

在真实的ASP.NET MVC网站中,您几乎没有机会使用OutPutCache。

问题在于没有使用甜甜圈缓存的保存方法。 这意味着您缓存了大部分页面,但是某些部分是用户特定的,您没有缓存。 这在旧式的ASP.NET中有效。

菲尔·哈克(Phil Haack)撰写了有关甜甜圈缓存的文章,但事实证明在MVC2中它不可行http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx

我经常开始使用OutputCaching,而不是想着每个人都忘记的这个特定于用户的小细节。

您可能会认为:我可以通过做一些Java脚本工作来解决此问题,这些工作可以加载动态数据...对于面向公众的网站来说是个坏主意。 有非javascript客户端,还有Google bot。

首先,我很害怕这可能会使我们的高流量站点瘫痪:但是通过将调用结果缓存到数据层中,它可以很好地工作。

  ask by Felipe Oriani translate from so

未解决问题?本站智能推荐:

3回复

任何众所周知的启动网站的方法,以便进行输出缓存

假设我们有一个在IIS 7.5上运行并使用ASP.NET MVC 3构建的网站。 还要假设该网站上有很多产品的唯一页面,并且所有这些页面都在内存中缓存了24小时。 还有其他页面也可以从输出缓存中受益。 一切都很好,直到这里。 一旦我们将新的更新部署到IIS中,该池就会被回收,并且所有缓
2回复

输出缓存到期会导致WebApi请求(MVC5/webapi2)突然增加

我正在使用MVC5提供页面并从WebApi服务获取数据。 MVC5应用程序向WebApi初始页面加载发出大约60个请求以获取所有数据,我在MVC5侧使用OutputCache。 这将一直有效,直到缓存过期。 当“输出”缓存到期时,会触发对API的新调用,因为有很多人在使用该网站,因此在发
4回复

如何缓存asp.net网站以获得更好的性能

我是一名网页设计师,通常设计公司网站,通常不需要更新。 所以我想将输出缓存一天。 我怎样才能做到这一点? 此外,还接受任何有关在慢速服务器上提高asp.net性能的建议。
3回复

有关在高流量网站中缓存的问题

假设我们正在建立一个电子商务站点,使消费者可以通过键入关键字来搜索产品。 假设最多有20万种产品,并且有数百万的消费者在使用该系统。 假设产品表的更新频率很高。 由于产品数量不是很高,因此我们可以将整个产品表存储在内存中并对其进行搜索,而不用访问数据库。 我们希望创建存储相同数据但驻留在
1回复

我可以在浏览器中缓存https资源吗?

我目前正在努力改善asp.net mvc 4应用程序的性能。 整个站点都位于https中,因此所有静态资源(例如javascript,css,图片等)均通过https提供。 我读到了不同的反馈,因为它无法在客户端浏览器中缓存此类资源-这是正确的吗? 有办法解决吗?
1回复

何时从数据库更新ViewModel[缓存ViewModel]

好吧,我将尝试使事情简短明了。 如您所知,我有使用EntityFramework的数据库,然后有通过数据库初始化的数据库模型类,然后有视图模型,其中有每个html控件的字段,最后有控制器一个特定的ViewModel实例。 我的问题是,视图模型是在控制器(任何操作)请求上创建一次的 ,其他
1回复

哪种类型的缓存适合在Umbraco项目中使用,如何实现智能缓存?

Umbraco中的HttpContext.Current.Cache和ApplicationContext.ApplicationCache.RuntimeCache什么不同? 哪一个在效率方面更好用? 我在我的项目和ASP.NET MVC使用过Umbraco 7.4.x 在我的项目中,
1回复

无论如何,有没有从缓存方面监视一个(类)对象?

我正在尝试确定哪种数据结构实现最适合Web应用程序。 基本上,我将为每个唯一用户维护一组“状态”类,并且该状态将在用户登录时缓存一段时间,并且在非滑动期之后,该状态将保存到db。 因此,为了平衡数据库负载和iis内存,我必须确定什么是缓存的最佳(预期)超时。 我的问题是,如何监视一组对象