利用客户端缓存对网站进行优化

news/2024/5/22 11:26:59/文章来源:https://blog.csdn.net/weixin_33853794/article/details/90130777

很多人首先会想从服务器缓存方面着手对程序进行优化,许多不同的服务器缓存方式都有他们自己的特点,像我曾经参与的一些项目中,根据缓存的命中率不同使用过 Com+/Enterprise Libiary Caching/Windows服务,静态文件等方式的服务器端缓存和 HTTP Compression技术,但客户端缓存往往却被人们忽略了,即使服务器的缓存让你的页面访问起来非常地快,但她依然需要依赖浏览器下载并输出,而当你加入客户端缓存时,会给你带来非常多的好处.因为她可以对站点中访问最频繁的页进行缓存充分地提高 Web 服务器的吞吐量(通常以每秒的请求数计算)以提升应用程序性能和可伸缩性。
一个在线购物调查显示,大多数人愿意去商店排队,但在在线购物时却不愿意等待。Websense调查公司称多达70%的上网者表示不愿意在页面读取上超过10秒钟。超过70%的人会因为中途速度过慢而取消当前的订单。

基础知识

1) 什么是”Last-Modified”?

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

2) 什么是”Etag”?

HTTP 协议规格说明定义ETag为“被请求变量的实体值” (参见 —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:

ETag: "50b1c1d4f775c61:df3"

客户端的查询更新格式是这样的:

If-None-Match: W/"50b1c1d4f775c61:df3"

如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。本人测试Etag主要在断点下载时比较有用。

Last-Modified和Etags如何帮助提高性能?

聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
过程如下:
1. 客户端请求一个页面(A)。
2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

示例代码

下面的例子描述如何使用服务器端代码去操作客户端缓存:

复制代码
ContractedBlock.gifExpandedBlockStart.gifCode
1//默认缓存的秒数
2 int secondsTime = 100;
3
4//判断最后修改时间是否在要求的时间内
5//如果服务器端的文件没有被修改过,则返回状态是304,内容为空,这样就节省了传输数据量。如果服务器端的文件被修改过,则返回和第一次请求时类似。
6 if (request.Headers["If-Modified-Since"] != null && TimeSpan.FromTicks(DateTime.Now.Ticks - DateTime.Parse(request.Headers["If-Modified-Since"]).Ticks).Seconds < secondsTime)
7ExpandedBlockStart.gifContractedBlock.gif{
8//测试代码,在这里会发现,当浏览器返回304状态时,下面的日期并不会输出
9 Response.Write(DateTime.Now);
10
11 response.StatusCode = 304;
12 response.Headers.Add("Content-Encoding", "gzip");
13 response.StatusDescription = "Not Modified";
14 }
15else
16ExpandedBlockStart.gifContractedBlock.gif{
17//输出当前时间
18 Response.Write(DateTime.Now);
19
20//设置客户端缓存状态
21 SetClientCaching(response, DateTime.Now);
22 }
23
24ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
25/// 设置客户端缓存状态
26/// </summary>
27/// <param name="response"></param>
28/// <param name="lastModified"></param>
29private void SetClientCaching(HttpResponse response, DateTime lastModified)
30ExpandedBlockStart.gifContractedBlock.gif{
31 response.Cache.SetETag(lastModified.Ticks.ToString());
32 response.Cache.SetLastModified(lastModified);
33//public 以指定响应能由客户端和共享(代理)缓存进行缓存。
34 response.Cache.SetCacheability(HttpCacheability.Public);
35//是允许文档在被视为陈旧之前存在的最长绝对时间。
36 response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));
37//将缓存过期从绝对时间设置为可调时间
38 response.Cache.SetSlidingExpiration(true);
39 }
复制代码


如果你的缓存是基于文件的方式,如XML或http中的.ashx处理,也可以使用下面的基于文件方式的客户端缓存:

复制代码
ContractedBlock.gifExpandedBlockStart.gifSetFileCaching
1ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
2/// 基于文件方式设置客户端缓存
3/// </summary>
4/// <param name="fileName"></param>
5private void SetFileCaching(HttpResponse response, string fileName)
6ExpandedBlockStart.gifContractedBlock.gif{
7 response.AddFileDependency(fileName);
8//基于处理程序文件依赖项的时间戳设置 ETag HTTP 标头。
9 response.Cache.SetETagFromFileDependencies();
10//基于处理程序文件依赖项的时间戳设置 Last-Modified HTTP 标头。
11 response.Cache.SetLastModifiedFromFileDependencies();
12 response.Cache.SetCacheability(HttpCacheability.Public);
13 response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));
14 response.Cache.SetSlidingExpiration(true);
15}
16
复制代码



本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2010/04/08/1707678.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_722797.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 强制跳转https_通过HTTPS提高你的网站安全性

HTTPS简介HTTPS(Hyper Text Transfer Protocol Over Secure Socket Layer)是以安全为目标的HTTP通道。简单来说&#xff0c;通过HTTP协议访问的网站&#xff0c;在登陆和数据传输过程中所有信息都是没有加密的&#xff0c;黑客很容易就能获取用户访问网站的所有信息。而HTTPS则…

dux社会化分享代码_第五节.外贸网站Google排名优化基本要素分析- 外贸建站前必做的SEO优化分享...

1.分析网站SEO优化排名的因素:外贸老船长经过多年外贸网站SEO优化经验&#xff0c;总结出了影响Google排名的几大因素&#xff0c;概括如下&#xff1a;页面链接指标与特定页面相关的链接指标&#xff0c;如链接数量&#xff0c;链接的相关性&#xff0c;页面链接的可信度和权威…

iis php 无法访问此网站_小技巧:使用appcmd来自动化部署IIS网站

在工作中&#xff0c;时常会花费宝贵的时间做重复的事情&#xff0c;比如使用IIS图形界面部署一个新网站。今天我们就来聊一下如何使用appcmd这一命令行工具来简化这个工作。appcmd简介appcmd&#xff0c;是一个微软操作系统自带的命令行工具&#xff0c;位于系统的C:windowssy…

买空间做网站_如何去做好网站推广

想要通过网站来做推广&#xff0c;首先你要有一个明确的目标。有的网站做推广是要流量&#xff0c;有的网站做推广是要下载量&#xff0c;有的网站做推广是要咨询量。不同的目标都有不同的推广方式。用网站做推广的实施是通过各种具体的方法来实现的&#xff0c;所有用网站做推…

读书笔记ZBLOG网站是否可以打造成10万IP的流量站?[图]

2019独角兽企业重金招聘Python工程师标准>>> 博客是靠博主一点点积累起来的个人网站&#xff0c;主要是记录作者的一些心得和学习笔记&#xff0c;或者写一个主题。但是纵观国内的博客网站&#xff0c;没有发现一个独立博客是做到了10万IP的&#xff0c;这说明了什么…

网站301跳转

源码&#xff1a; protected void Application_BeginRequest(object sender, EventArgs e){HttpApplication application sender as HttpApplication;HttpContext context application.Context;HttpRequest request context.Request;HttpResponse response context.Respons…

4个珍藏已久的宝藏资源网站,提高你的工作效率

相信在日常办公中我们都有几个用了很久的资源网站&#xff0c;如果你不舍得分享出来&#xff0c;那么&#xff0c;小编就先一步啦&#xff0c;下面小编将分享几个珍藏了很久的资源网站&#xff0c;都是陪伴了小编好几年的网站&#xff0c;如果你有更好的分享可以评论区留言哦&a…

如何实现分享网站文章到微信朋友圈时显示指定缩略图或LOGO

当下朋友圈很火&#xff0c;很多企业都将微信朋友圈作为品牌传播的途径&#xff0c;经常会发一些精彩的文章到微信朋友圈供大家自发传播&#xff0c;这样的想法很好&#xff0c;对于优质的内容&#xff0c;网友们也乐于转发与朋友们分享&#xff0c;对品牌宣传与推广确实是有好…

VS2012 + IIS Web 发布(三)——网站发布

VS2012 IIS Web 发布(三)——网站发布 前面的工作如果都做好了&#xff0c;接下了就是真真正正的网站发布了&#xff0c;打开IIS 界面&#xff0c;具体 操作步骤如下&#xff1a; 一、基本的网站添加&#xff1a;1、通过》控制面板》管理工具》启动 ‘Internet信息服务(IIS)管…

ISS 网站发布没数据解决

ISS 网站发布没数据解决 一、背景&#xff1a; ITOO基础部“机构管理”系统在本地电脑发布成功&#xff0c;但是服务器上一直发布出来没 有数据。 以菜鸟的身份家人 ITOO 4.0系统的学习&#xff0c;负责基础部的“机构管理”模块&#xff0c;有一项 任务就是 checkout 机构管…

网站系统的“用户登录”

网站系统的“用户登录” 前言 现在的系统&#xff0c;几乎所有的网站&#xff0c;都有自己的数据库&#xff0c;有自己的VIP区&#xff0c;为了更好的服务 和方便用户&#xff0c;同时也是为了网站本身更好的管理&#xff0c;都有用户模块区。 用户在网站可以注册自己的信息&am…

网站系统---数据库的设计

网站系统---数据库的设计 前言&#xff1a; 每一个完整或系统的的设计初衷&#xff0c;都是为了数据更好的管理和查询&#xff0c;数据库的设计也就是极其的显著和重要。下面是就以例子网上商城的数据库设计聊一聊数据库的设计了。 1 表与表之间视图&#xff1a; 2 数据库设计:…

【网站高性能 1】----机械硬盘 vs 固态硬盘

机械硬盘 vs 固态硬盘前言&#xff1a;今天下午小编看Mybatis视频&#xff0c;敲代码中真的是就快睡着了&#xff0c;就离开座位出去想走走&#xff0c;就去了图书馆&#xff0c;也就是随性拿起一本书《大型网站技术机构》&#xff0c;也即是随性的想随便的翻一翻&#xff0c;可…

【网站高性能 2】----RAID vs HDFS

RAID vs HDFS一&#xff0c;定义&#xff1a;RAID&#xff1a;全称是&#xff08;Redundant Arrays of independent Disks,DAID&#xff09;叫磁盘阵列&#xff1a;有独立磁盘构成的具有冗余能力的阵列的意思。raid通俗的说就是有很多价格较合理的磁盘&#xff0c;组成一个容…

【网站高性能 3】----B+树 vs LSM树

B树 vs LSM树 前言&#xff1a; 在前面我们介绍到&#xff0c;性能优化之存储性能优化有将&#xff08;1&#xff09;机械硬盘改成固态硬盘&#xff0c;&#xff08;2&#xff09;磁盘阵列方式RAID vs HDFS &#xff0c;今天小编和大家分享一个在存储过程&#xff0c;从数据…

【网站高性能 4】----网站本身测试(一)

【网站高性能 4】----网站本身测试指标&#xff08;一&#xff09; 一个好的网站&#xff0c;我们总会有看起来舒服&#xff0c;浏览起来速度给力&#xff0c;这是我们最基本的评判&#xff0c;那么从专业的角度来说&#xff0c;到底有哪些指标呢&#xff1f; 今天小编就带你一…

【网站高性能 5】----网站本身测试(二)

【网站高性能 5】----网站本身测试&#xff08;二&#xff09; 前言&#xff1a; 一个网站好不好&#xff0c;从不同的人看起来是不同的。比如我现在是用户&#xff0c;评价一个网站好坏那就很简单&#xff0c;每一次的点击打开&#xff0c;页面反映的快慢就反应出网站的好坏&a…

【网站高性能 6】----大型网站架构演化知多少(一)

架构演化知多少&#xff08;一&#xff09; 前言&#xff1a; 在大型网站中的技术挑战主要是来自什么&#xff1f;主要是庞大的用户、高并发的访问和海量的数据&#xff0c;任何简单的业务一旦要处理数以P计的数据和数以亿计的用户&#xff0c;问题就会变的很棘手。那么大型网站…

【网站高性能 7】----大型网站架构演化知多少(二)

大型网站架构演化知多少&#xff08;二&#xff09; 前言&#xff1a; 在前一博文&#xff1a;大型网站架构演化知多少&#xff08;一&#xff09;中小编介绍了大型网站的架构发展历程&#xff0c;从初级的架构中只有一台服务器到增加服务器&#xff0c;再到使用缓存&am…

你不可不知的网站:stackoverflow

你不可不知道的网站&#xff1a;stackoverflow 序言&#xff1a; 这是个什么东西&#xff1f;” stackoverflow” 是个国外的论坛网站&#xff0c;计算机技术交流社区&#xff0c;基本上我们现在遇到的问题&#xff0c;在那里都可以找到相关的答案&#xff0c;我们中文遇到的问…