开源项目大家谈-网站性能调校-Cache的使用

简介: 之所以用这个题目是因为很多人常常问我研究开源项目的意义,有一些开源项目在别人眼里看起来完全没有搞头,是一些没有实用价值的项目。其实开源项目往往是新技术的试验田,是全世界优秀程序开发者智慧的汇集,如果你仔细研读这些开源项目,得到的不仅仅是这个项目的功能,而是观摩新的技术,学习比你更聪明人的智慧。

之所以用这个题目是因为很多人常常问我研究开源项目的意义,有一些开源项目在别人眼里看起来完全没有搞头,是一些没有实用价值的项目。其实开源项目往往是新技术的试验田,是全世界优秀程序开发者智慧的汇集,如果你仔细研读这些开源项目,得到的不仅仅是这个项目的功能,而是观摩新的技术,学习比你更聪明人的智慧。

我一直研究的一个开源项目是DotNetNuke(简称DNN),也许你不知道这是一个什么系统,不过你不用关心这是一个什么系统,因为我要讨论的技术在任何一个ASP.NET网站里都有可能用到,只是用这个开源项目做示范罢了,不过你会看到在开源项目里,MSDN里那些死板的技术说明是如何巧妙发挥功能。

这一系列的文章:

开源项目大家谈-网站性能调校-Page State Persistence

开源项目大家谈-网站性能调校-Cache的使用

使用缓存(Cache)

对于缓存(Cache)的概念我想大家都很熟悉,网上也有很多介绍的文章,我在这里就不赘述了。

对网站访问最频繁的部分使用缓存

虽然大家都知道这个概念,但大家在做项目的时候不一定都思考过如何以及何时使用缓存。

我们来看看这个开源系统的这个设置:

image 

对于如何选择这个两项,似乎没什么太难理解的,这里是决定把对module的缓存放在内存里还是放在硬盘里,当然,选择"Memory"会提高速度。

但有一点是我们要学习的,那就是为什么会有这么一个选择。之所以出现这样一个选择,是因为这个开源系统的设计人员发现这个系统对于module这一部分的操作特别频繁,所以对于所有读取出的module信息都会放入缓存,从而加快系统的速度,也就是说,设计人员主动的分析了系统的特点,使用了缓存,这是最值得我们学习的地方。

Cache生存周期对网站性能的影响

在这个开源项目中,我们可以看到这样一个选项,对于"Performance Settings",你可以选择:

  • No Caching
  • Light Caching
  • Moderate Caching
  • Heavy Caching

调节这些设置肯定能调校网站的性能,当到底有什么影响呢?技术上又是如何实现的呢?

image
 

查看源代码,我们发现PerformanceSettings 的值有三种,分别是0、1、3、6,那这几个值又是如何来控制cache的性能,从而调校整个网站的性能呢?

        Public Enum PerformanceSettings
            'The values of the enum are used to calculate
            'cache settings throughout the portal.
            'Calculating based on these numbers keeps 
            'the scaling linear for all caching.
            NoCaching = 0
            LightCaching = 1
            ModerateCaching = 3
            HeavyCaching = 6
        End Enum
 

我们看看下面的代码就可以明白了:

Dim intCacheTimeout As Integer = 20 * Convert.ToInt32()
DataCache.SetCache(strCacheKey, objFile, TimeSpan.FromMinutes(intCacheTimeout))

原来,系统使用PerformanceSettings的值来控制cache的生存时间,从而为不同特性的网站内容提供不同的cache生存时间,达到调校网站性能的目的。这的确是一个值得学习的精妙设计。

Authenticated Cacheability对网站性能的影响

在这个开源系统的性能设置里,还有一个Authenticated Cacheability的设置:

image

什么是 Authenticated Cacheability

Cache可以应用在服务器端,也可以使用在客户端,客户端对于访问的网页都会进行缓存,但出于某种原因,你也可以指定客户端不缓存你的网页。

当 Web 服务器发送响应时,在它传递的所有信息中包括一个 Cache-Control HTTP 标头,该标头定义可在其上缓存文档的设备。ASP.NET 在 HttpCacheability 枚举中定义这些值。该枚举具有六个值,其中四个值直接映射为 Cache-Control HTTP 标头设置,另外两个特殊值分别为 HttpCacheability.ServerAndPrivateHttpCacheability.ServerAndNoCacheServerAndPrivate 只允许将响应缓存在原服务器和请求客户端上。而 ServerAndNoCache 只允许将响应缓存在原服务器上。

这些设置当然会影响到你网站的性能,相对于做了缓存的页面,没有缓存的页面需要花更多的时间来显示。

这个开源系统利用了这一点,你可以自己选择客户端缓存的方式,有几个选项还会影响到服务器端的缓存。下面是关键的代码:

            If Request.IsAuthenticated = True Then
                ' set client side page caching for authenticated users
                If Convert.ToString(PortalSettings.HostSettings("AuthenticatedCacheability")) <> "" Then
                    Select Case Convert.ToString(PortalSettings.HostSettings("AuthenticatedCacheability"))
                        Case "0" : Response.Cache.SetCacheability(HttpCacheability.NoCache)
                        Case "1" : Response.Cache.SetCacheability(HttpCacheability.Private)
                        Case "2" : Response.Cache.SetCacheability(HttpCacheability.Public)
                        Case "3" : Response.Cache.SetCacheability(HttpCacheability.Server)
                        Case "4" : Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache)
                        Case "5" : Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
                    End Select
                Else
                    Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache)
                End If
            End If

对于HttpCacheability的几个值代表的意义如下:

  • NoCache:设置 Cache-Control: no-cache 标头。如果没有字段名,则指令应用于整个请求,且在满足请求前,共享(代理服务器)缓存必须对原始 Web 服务器强制执行成功的重新验证。如果有字段名,则指令仅应用于命名字段;响应的其余部分可能由共享缓存提供。
  • Private: 默认值。设置 Cache-Control: private 以指定响应只能缓存在客户端,而不能由共享(代理服务器)缓存进行缓存。
  • Server: 指定响应仅缓存在源服务器上。与 NoCache 选项相似。客户机接收 Cache-Control: no-cache 指令,但文档是在原始服务器上缓存的。等效于 ServerAndNoCache。
  • ServerAndNoCache: 应用 Server 和 NoCache 的设置指示在服务器上缓存内容,而对服务器以外的其他对象都显式否定其缓存响应的能力。
  • Public: 设置 Cache-Control: public 以指定响应能由客户端和共享(代理)缓存进行缓存。
  • ServerAndPrivate: 指示响应只能在服务器和客户端缓存。代理服务器不能缓存响应。

如何设置Authenticated Cacheability

对于很多网站,内容的保密性要求并不高,所以推荐设置为"Public”,这样能取得最大的性能优势。

更多关于Authenticated Cacheability

关于Authenticated Cacheability更具体的知识大家可以参考下面的几个文档:

[转]Asp.net 缓存(二)--设置页的可缓存性

MSDN: HttpCacheability Enumeration

John Mitchell's (mostly DotNetNuke) Blog

相关文章
|
7月前
|
存储 缓存 NoSQL
【性能飙升的秘密】FastAPI应用如何借助缓存技术实现极速响应?揭秘高效Web开发的制胜法宝!
【8月更文挑战第31天】FastAPI是一个高性能Web框架,利用Starlette和Pydantic实现高效API构建。本文介绍如何通过缓存提升FastAPI应用性能,包括使用`starlette-cache[redis]`实现Redis缓存,以及缓存一致性和缓存策略的注意事项。通过具体示例展示了缓存的配置与应用,帮助开发者构建更高效的Web应用。
412 0
|
7月前
|
缓存 数据库 UED
【性能翻倍的秘密】Rails高手从不告诉你的缓存技巧,竟让应用瞬间提速,背后真相令人震惊!
【8月更文挑战第31天】缓存是提升Web应用性能的关键技术,Ruby on Rails内置了多种缓存机制,如页面缓存、动作缓存、片段缓存及数据库查询缓存,可显著减少数据库查询次数并加快页面加载速度。本文通过具体案例分析了这些缓存策略,并提供了示例代码,展示如何在实际应用中实施这些策略,帮助开发者提升用户体验。
72 0
|
10月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
10月前
|
缓存 前端开发 JavaScript
网站性能不佳?试试这十大前端性能优化技巧!(二)
网站性能不佳?试试这十大前端性能优化技巧!
|
10月前
|
缓存 前端开发 JavaScript
网站性能不佳?试试这十大前端性能优化技巧!(一)
网站性能不佳?试试这十大前端性能优化技巧!
|
缓存 前端开发 JavaScript
近期对前端性能优化的总结
近期对前端性能优化的总结
149 1
|
SQL 监控 前端开发
网页性能优化实战之CPU拉满问题处理
今天测试小哥屁颠屁颠的找过来说查询会员信息这块访问速度很慢,之前没有问题,现在输入信息之后根本就没有反应.要等好好长时间才行.另外点击其他页面都是显示网络连接异常,感觉整个系统都会崩溃了。每次测试找过来都当做是对自己的一次技术提升,尤其是对和业务逻辑关联不高的问题更感兴趣,哈哈!现在把问题分析以及处理过程简单记录一下,希望对有相同线上问题的同学能提供一些解决思路.
网页性能优化实战之CPU拉满问题处理
|
人工智能 前端开发 算法
别人都不知道的“好用”网站,让你的效率飞快
哈喽~大家好呀,这篇文作为一个分享文,分享本人在平时学编程是遇到的那些好用并且“奇奇怪怪”的网站,像比如学算法的时候什么网站效率高,什么网站通俗易懂,学前端的时候,什么网站效果很炫酷,学人工智能的时候,什么网站方便简洁,找工作刷题。什么网站更好等等。下面我们就来看看吧。
1355 1
别人都不知道的“好用”网站,让你的效率飞快
|
缓存 前端开发 rax
揭秘 cache 访问延迟背后的计算机原理
本文介绍如何测试多级 cache 的访存延迟,以及背后蕴含的计算机原理。
揭秘 cache 访问延迟背后的计算机原理
|
Web App开发 缓存 前端开发
网站性能优化的实战指南
性能优化是应用程序开发必须的工作之一,其目的之一为用户提供极致的速度体验,本文总结 WEB 应用或者网站可以快速实操的经验。
212 0