惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 阿福

TypeScript forms authentication failed the ticket supplied was invalid错误 (Windows Server 2008 + IIS 7.5) jQuery Mobile 1.1.1 RC1发布 HashSet<T> vs List<T> 不要用把无序GUID既作为主键又作为聚集索引 WCF Data Services 5.0 RTM发布 EF Power Tools Beta 2发布 Entity Framework 5性能方面的注意事项 jQuery Mobile 1.1.0 RC2发布 源码+幻灯片:学习HTML5/jQuery/ASP.NET MVC/EF Code First的绝佳资源Account at a Glance项目 使用Autofac在ASP.NET Web API上实现依赖注入 在Windows Azure上开发ASP.NET程序与在Windows Sever上有何不同 ASP.NET MVC 4, ASP.NET Web API, ASP.NET Web Pages v2 (Razor)全部开源,并接受来自社区的贡献(contributions) EF5 beta2通过NuGet发布 Getting Started with HTML5 开发HTML5应用你需要了解的 WCF入门资源 jquery history plugin, url hash Run Tasks in an ASP.NET Application Domain ASP.NET 2.0: 生成Excel报表 VS 2008 hot-fix终于出来了 Images; How to create an HTTP handler to dynamically resize images and change quality. ASP.NET 2.0: Add build-in paging feature to repeater/为repeater添加内置分页功能 Tip/Trick ASP.NET 2.0: DropDownList DataBind ASP.NET 2.0: Forms Authentication Across domains Ajax类库、框架、工具包完全列表
充分利用缓存来提高网站性能
阿福 · 2012-03-29 · via 博客园 - 阿福

[原文作者]:Omar [原文链接]:Making best use of cache for high performance website

使用URLs时要确保一致性 浏览器基于URL来缓存资源。当URL改变后,浏览器从源服务器获该资源的新的版本。查询字符串参数的改变也被视为URL的改变。例如,"/default.aspx" 被缓存到浏览器,如果你请求了"/default.aspx?123",浏览器将从服务器获取新的版本。对于这个新URL的响应,如果你返回的是正确的缓存报头,它仍然会被缓存。这样的话,再把查询字符串改成类似于"/default.aspx?456”,那么服务器将又返回一个新的版本。因此,当你想响应得到缓存时,就要确保你在各处使用了一致性的URL。在主页里,如果你请求了一个URL为"/welcome.gif"的文件,那么确保在其他页面里在请求该文件时也使用相同的URL。常见的一个错误是,有时会从URL中省略"www"子域。www.pageflakes.com/default.aspx与pageflakes.com/default.aspx是不同的,两者会被分别的缓存。

静态内容会被缓存得更久 静态内容可以被缓存得更久,例如一个月。  如果你正考虑应该只缓存几天,以便当你修改文件后,用户可以很快获取到新的版本,那么你错了。如果一个文件是通过设置过期报头(expires header)来缓存的,当你更新它时,新的用户可以立即获取到最新的版本,而老的用户只能看到旧的内容直到它在浏览器端过期。因此,只要你正在使用过期报头来缓存静态文件,把值设的越大越好。 例如,你已经通过设置过期报头值为3天来缓存一个文件,一个用户将在今天获取到该文件,并且保存在缓存区里直到三天过后;另一个用户将在明天获取到该文件,并缓存起来直到明天之后的三天。如果你后天改变该文件,第一个用户将在第四天看到它,第二个用户将在第五天看到它。因此,不同的用户将看到该文件的不同版本。结果是,设置一个低值对于保证所有用户在最短时间内得到最新的版本是没有帮助的。你将不得不通过修改文件的URL来确保所有人立即获得完全相同的一个文件。 你可以使用IIS管理器来为静态文件设置过期报头,后面的内容将会介绍如何设置。

使用缓存友好的文件夹结构 把要缓存的内容存储在一个共同的文件夹内。例如,把你网站的所有图片存储在"/static"文件夹内,而不是把图片分别地存储在不同的子文件夹下。这将有助于你在整个网站范围内使用一致性的URL,因为从任何地方你都可以使用"/static/images/ somefile.gif"。稍后,我们将学到,当把静态缓存文件放在一个共同的根文件夹内后,转移到一个内容传送网络将很容易。

重用相同的图形文件 有时我们把相同的图形文件存储于几个不同的虚拟目录下,以便可以书写很短的路径。例如,你有一个indicator.gif文件在根目录,一些子目录和CSS目录里。这样做是因为你不必担心从不同地方访问的路径问题,你只需要使用文件名作为相对URL。这却对缓存没有帮助。文件的每个拷贝都分别地缓存在浏览器端。因此,你应该把工程中所有的图像文件汇集到根目录下的"static"文件夹下,除去重复的,在所有页面和CSS文件里使用相同的URL。

改变文件名来使缓存过期 当你更改一个静态文件的时候,不要仅仅只是更新文件本身,因为它已经在客户端的浏览器缓存了。你需要更改文件名,并且更新所有各处的引用,这样浏览器才会获取到新的版本。你也可以把文件名存储在数据库或者配置文件中,通过数据绑定来动态的生成URL。以这种方式,你可以在一处来改变URL,而使整个站点立即得到更新。

使用版本号来访问静态文件 如果你不想因为要保存同样的文件的不同拷贝而使静态文件夹变得混乱,你可以使用查询字符串来区分同一文件的各个版本。例如,一个GIF文件可以和一个虚拟的查询字符串组合来访问,如"/static/images/indicator.gif?v=1"。当你更改了indicator.gif,你可以覆盖掉原来的文件,然后把所有到这个文件的引用更新为"/static/images/indicator.gif?v=2"。这样你可以重复修改同一文件,然后用新的版本号来更新所有到这个文件的引用。

把可缓存的文件存储在不同的域中 把静态内容存储在不同的域中,总是不失为一个好的办法。首先浏览器可以打开另外的并发连接来下载静态文件。另一个好处是你不需要发送cookies到静态文件。如果你把静态文件和你的web应用放在同一域中,浏览器会发送你的web应用产生的所有ASP.NET cookies和所有的其他cookies。这使得请求报头不必要的变大,浪费带宽。访问静态文件时你并不需要发送这些cookies。因此,如果你把静态文件放在不同的域中,那些cookies将不会被发送。例如,把静态文件放在www.staticcontent.com域,而在www.dropthings.com域运行你的网站。不同的域并意味着必须是完全不同的网站。它可能仅仅是个别名,而物理上和web应用共享同一路径。

安全套接字(SSL)不会缓存,尽量少用 任何经过SSL处理的内容都不会被缓存。因此,你需要把静态内容置于SSL之外。此外,你应该尽量将SSL应用于一些安全页面,如登录页面或者支付页面。其余的应该使用常规的HTTP而不是SSL。SSL加密请求和响应,因而增加了服务器的额外负担。加密后的内容也比原始内容要大,因而占据更多带宽。

HTTP POST请求从不被缓存 缓存只相对于HTTP GET请求。HTTP POST请求从来不被缓存。因此,任何形式的AJAX调用,如果想被缓存,需要以HTTP GET的形式调用。

生成内容长度响应报头(content-length reponse header) 当你通过web services调用或者HTTP handlers动态地提供内容时,请确保生成了Content-Length报头。浏览器通过查看响应的Content-Lenght报头会知道有多少内容要被下载,这样它会有多种优化方案来提高下载速度。如果有这个报头信息,浏览器会更有效的利用持续连接。这将避免浏览器为每个请求新开一个连接。在没有Content-Lenght报头信息的状况下,浏览器不知道要从服务器接收多少内容,因而只要它从服务器端获取到字节流,就会保持连接为打开状态直到连接关闭。因此,你失去了持续连接带来的好处,它可以极大的缩短一些小文件的下载时间,,如css、javascripts、以及图片文件。

如何在IIS中配置静态内容的缓存 在IIS管理器中,网站属性对话框有个“HTTP Headers“页,在那里你可以对所有IIS处理的请求定义过期报头。在那你可以定义内容立即过期,或是几天后过期,或者在某个特定日期过期。第二个选项(Expires after)使用的是相对过期,不是绝对过期。这个非常有用,因为它对每个请求都起作用。无论谁请求了一个静态文件,IIS会基于Expire after选项天/月的数字来计算过期日期。  
对于由ASP.NET来处理的动态页面,一个handler可以修改过期报头的值来覆盖IIS的默认设置。