web缓存相关概念及测试

深入理解PHP图片缓存及Etag机制

本打算在上一篇文章中将自己关于PHP图片缓存的理解写出来的,写了一半感觉似是而非,不得不停下来继续学习。

找到下面这两篇篇文章,做个收藏,回头再整理,先工作。。

http://www.cnblogs.com/_franky/archive/2011/11/23/2260109.html

http://www.cnblogs.com/_franky/archive/2012/07/05/2577141.html


Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。


现在我们有个问题为什么要使用Etag呢?


Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个 文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法 判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问 题.


Etag的工作原理
Etag在服务器上生成后,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。我们常见的是使用If- None-Match.请求一个文件的流程可能如下:
新的请求
客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如”2e681a-6-5d044840″),http头状态 码为为200.


同一个用户第二次这个文件的请求
客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如”2e681a- 6-5d044840″),这时服务器判断发送过来的Etag和自己计算出来的Etag,因此If-None-Match为False,不返回200,返 回304,客户端继续使用本地缓存;


注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在完全匹配If-Modified- Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.

在Apache中设置Etag的支持比较简单,只需要在apache的配置中加入下面的内容就可以了:
比如我现在在.htaccess文件里面写

<IfModule mod_headers.c>
<FilesMatch ".(gif|jpg|jpeg|png|ico)$"> 
#Header set Expires "Thu, 01 Dec 2003 16:00:00 GMT"
#Header set Cache-Control "no-store"
ExpiresDefault A6048
ExpiresByType image/png A30
FileETag MTime Size
</FilesMatch>


opera不知道为什么每次都会去服务器请求一次,即使没过期也不会使用本地缓存,这个之后再研究

opera的http头如图:


今天我又测试了一遍,代码都没有变化,但是opera的表现变的很乖巧了,下面是测试结果,以下所有的游览器(都是最新版本的测试结果)都使用了本地缓存:

Opera:


Chrome:


ps:之前犯糊涂,chrome 设置了disable cache....测试结果纠结死我了

firfox:

刷新结果:

再次请求(非刷新),从firebug直接看不到请求信息,使用了本地缓存

IE:

跟firefox表现一致,使用本地缓存时在自带的开发者 工具中直接看不到请求


<think> 首先,用户的问题是关于“web测试中独立缓存实例”的内容,包括使用方法、配置方式、作用等。用户提供了几个引用,我需要参考这些引用来构建回答。 回顾引用内容: - 引用[1]:讨论.NET中的HttpRuntime.Cache测试代码。 - 引用[2]:关于Web缓存的基本知识。 - 引用[3]:System.Web.Caching.Cache类的描述,提到它可以通过HttpRuntime.Cache访问,在应用程序域中是单例。 - 引用[4]:描述了一个缓存策略的实现,涉及页面执行结果的缓存。 - 引用[5]:讨论了async/await的性能优势,但不直接相关。 用户指定要参考上一次问题和我的回答,但在这个对话中,这是第一次交互,所以我需要基于提供的引用和系统指令回答。 系统指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题,真实可靠。 用户的问题焦点是“web测试中独立缓存实例”。从引用[3],提到System.Web.Caching.Cache在应用程序域中是单例实例,即每个应用程序域只有一个实例。这暗示了“独立缓存实例”可能指的是如何在不同上下文(如测试环境中)创建或管理独立的缓存实例。 关键点: - 在Web开发中,缓存常用于提高性能。 - 在测试中,可能需要独立的缓存实例来隔离测试环境,避免污染生产缓存或确保测试的独立性。 基于引用: - 引用[3]:System.Web.Caching.Cache 是每个应用程序域的单例。 - 引用[4]:描述了缓存策略在页面执行中的应用。 - 引用[1]:有测试代码示例。 我的回答应该包括: 1. **独立缓存实例的定义和作用**:解释在Web测试中为什么需要独立缓存实例,如在单元测试中隔离依赖。 2. **使用方法**:如何在代码中创建和访问独立的缓存实例,比如在.NET中使用HttpRuntime.Cache或自定义缓存。 3. **配置方式**:如何配置缓存设置,如过期时间、大小限制等。 4. **作用**:讨论在测试中使用独立缓存的好处,如提高测试可靠性、避免数据污染。 添加引用:当引用特定内容时,在段落末尾加[^n]。 生成相关问题:在回答末尾添加相关问题。 结构回答: - 引言:简要介绍Web缓存测试中的独立缓存实例。 - 主体: - 解释独立缓存实例的概念和作用。 - 使用方法:提供代码示例。 - 配置方式:讨论配置选项。 - 作用:阐述优点。 - 结论:总结。 - 相关问题:生成3-4个相关问题。 使用中文。 在回答中,如果提到数学或技术细节,确保LaTeX格式正确。但这个问题可能不涉及数学,所以可能不需要。 代码示例:参考引用[1],有C#代码,我可以使用它作为基础。 最终输出格式: - 回答内容。 - §§相关问题§§ - 相关问题列表。 </think> ### Web测试中独立缓存实例的相关知识 在Web开发和测试中,独立缓存实例是指在特定环境中(如单元测试或隔离环境)创建与管理独立的缓存对象,以避免与生产缓存冲突,确保测试的可靠性和可重复性。这种机制常用于模拟缓存行为、隔离数据依赖以及验证缓存策略。以下基于提供的引用内容,我将逐步解释独立缓存实例的使用方法、配置方式和作用。 #### 1. **独立缓存实例的概念与作用** - **定义**:独立缓存实例是应用程序域(AppDomain)中的一个独立对象,用于存储临时数据(如页面输出、数据库查询结果)。在Web测试中,它允许开发者创建隔离的缓存环境,防止测试操作影响生产缓存,从而提高测试的准确性。 - **作用**: - **隔离测试环境**:在单元测试中,独立缓存实例可避免数据污染。例如,测试缓存过期策略时,不影响真实用户的缓存数据[^3]。 - **提高性能与可靠性**:通过模拟缓存命中/未命中场景,测试可验证缓存是否有效减少数据库访问。引用[4]中提到,缓存能显著提升页面加载速度(如首页加载时间降至15ms),而在测试中独立实例可确保这些优化被正确评估[^4]。 - **验证缓存策略**:测试缓存配置(如过期时间、依赖项)是否正确应用,确保在高并发或故障场景下缓存行为一致。 #### 2. **使用方法:创建与访问独立缓存实例** 在.NET框架中,`System.Web.Caching.Cache` 类是实现缓存的核心,可通过`HttpRuntime.Cache`访问。每个应用程序域仅有一个实例,但在测试中,可以模拟或创建新实例来实现独立性。 - **基本访问方式**: - 在ASP.NET应用中,使用`HttpRuntime.Cache`直接操作缓存。代码示例如下(参考引用[1]和[3]): ```csharp // 添加缓存项 HttpRuntime.Cache.Insert("key", "value", null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration); // 读取缓存项 var cachedValue = HttpRuntime.Cache.Get("key"); ``` - 在测试中,为避免共享实例,可使用依赖注入(DI)或模拟框架(如Moq)创建独立缓存对象。例如: ```csharp // 在单元测试中,使用模拟缓存 var mockCache = new Mock<System.Web.Caching.Cache>(); mockCache.Setup(c => c.Get("key")).Returns("testValue"); // 注入到被测代码 var service = new MyService(mockCache.Object); service.PerformOperation(); ``` - **独立实例的创建**: - 对于非Web环境(如控制台测试应用),可直接实例化`System.Web.Caching.Cache`(需引用`System.Web`程序集)。但注意,在ASP.NET Core中,推荐使用`IMemoryCache`接口,它与`HttpRuntime.Cache`类似但更轻量。 - 示例代码(基于引用[3]): ```csharp // 创建独立缓存实例 var cache = new System.Web.Caching.Cache(); cache.Insert("testKey", "testData", null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10)); // 在测试方法中使用 Assert.Equal("testData", cache.Get("testKey")); ``` #### 3. **配置方式** 独立缓存实例的配置涉及设置缓存策略,如过期时间、依赖项和大小限制。配置通常在代码中完成,而非配置文件,以增强测试灵活性。 - **常见配置选项**: - **过期策略**:设置绝对过期(特定时间点)或滑动过期(最后一次访问后一段时间)。例如: ```csharp // 绝对过期:30分钟后失效 HttpRuntime.Cache.Insert("key", "value", null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration); // 滑动过期:10分钟内未访问则失效 HttpRuntime.Cache.Insert("key", "value", null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10)); ``` - **依赖项**:基于文件、数据库或其他缓存项的变更触发失效。这在测试中用于验证缓存一致性。 - **大小限制**:通过`CacheItemPriority`设置优先级,避免测试中内存溢出。 - **测试专用配置**: - 在单元测试框架(如xUnit或NUnit)中,使用`[SetUp]`方法初始化独立缓存,并在`[TearDown]`中清除缓存,确保每次测试隔离。例如: ```csharp private System.Web.Caching.Cache _testCache; [SetUp] public void Setup() { _testCache = new System.Web.Caching.Cache(); // 创建独立实例 } [Test] public void TestCacheExpiration() { _testCache.Insert("key", "value", null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration); Thread.Sleep(6000); // 模拟时间流逝 Assert.IsNull(_testCache.Get("key")); // 验证过期 } [TearDown] public void Cleanup() { _testCache.Dispose(); // 清理缓存 } ``` #### 4. **在Web测试中的作用与优势** - **性能测试**:独立缓存实例可模拟高负载场景,验证缓存如何减少数据库查询(如引用[4]所述页面加载优化),并测量响应时间改进[^4]。 - **可靠性测试**:测试缓存失效机制(如依赖项变更),确保应用在缓存丢失时仍能正确回源获取数据。 - **安全与兼容性**:隔离测试可检查缓存注入攻击或跨应用域问题(引用[3]提到缓存在每个应用程序域是单例),避免生产环境风险。 - **整体优势**:结合引用[5]的异步模型,独立缓存可提升测试效率,例如通过`async/await`模拟并发访问,实现“可维护性与互操作性之间的平衡”[^5]。 总结来说,Web测试中的独立缓存实例是确保测试纯净性和效率的关键工具。通过创建隔离环境、配置灵活策略,并在代码中直接操作,开发者能有效验证缓存行为,提升应用性能与鲁棒性。实践中,建议结合单元测试框架和模拟工具(如Moq)来实现最佳隔离效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值