为什么访问HttpContext.Items比HttpContext.Cache慢得多?

时间:2017-11-15 10:33:54

标签: asp.net caching

我们的网站目前在单个Web服务器上运行,并使用HttpContext.Cache。我们正在寻求使网站负载平衡,并且需要使用某种形式的分布式缓存。我一直在关注AppFabric,但我记得使用HttpContext.Items作为每请求缓存,并且我认为我可以利用它来实现与分布式缓存类似的功能。

以下是高速缓存代码:

Public Shared Function getFromCache(key As String) As Object
    Return HttpContext.Current.Cache(key)
End Function

Public Shared Sub addToCache(key As String, value As Object)
    addToCache(key, value, CACHE_DURATION_IN_MINUTES)
End Sub

Public Shared Sub addToCache(ByVal key As String, ByVal value As Object, ByVal durationInMinutes As Integer)
    HttpContext.Current.Cache.Insert(key, value, Nothing, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(durationInMinutes))
End Sub

平均页面加载时间约为35毫秒(条形图异常):

Page load times with HttpContext.Cache

在进行更改以使用HttpContext.Items后,平均页面加载时间大幅增加

Public Shared Function getFromCache(key As String) As Object
    Return HttpContext.Current.Items(key)
End Function

Public Shared Sub addToCache(key As String, value As Object)
    addToCache(key, value, CACHE_DURATION_IN_MINUTES)
End Sub

Public Shared Sub addToCache(ByVal key As String, ByVal value As Object, ByVal durationInMinutes As Integer)
    HttpContext.Current.Items.Add(key, value)
End Sub

平均页面加载时间从35毫秒跃升至1,000 - 1,200毫秒!

Page load times with HttpContext.Items

有什么看起来奇怪吗?据我所知,HttpContext.Current.Items是一个每个请求字典,在每个请求之前被初始化,因此我假设访问它的速度与使用Cache一样快。

1 个答案:

答案 0 :(得分:1)

我忘了跟进这个问题的答案 - 基本上,它并不慢。如果本地网站的图像文件夹中缺少产品图像,则应用程序将向实际站点发出HTTP请求以下载该产品的图像并设置缓存密钥以保存它已发出此请求,以避免必须进行这些查找在后续页面刷新。

这取决于使用内存缓存来存储它是否曾尝试下载产品图像,并且在将其更改为使用HttpContext.Items之后,应用程序只会记住它在尝试这些下载的过程中该请求,然后忘记它 - 所以刷新页面将再次触发整个HTTP请求到现场网站下载产品图像,这是在服务器端完成并需要更长的时间。

傻傻的我:)。