`
xw_qixia
  • 浏览: 21277 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

利用last-modify 和 If-Modified-Since 做页面缓存

阅读更多

在http中  Last-Modified 与  If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,

注意,在这 Last-Modified 是由服务器往客户端发送的 HTTP 头

另一个 If-Modified-Since是由客户端往服务器发送的头

那么它们的到底是怎么玩的呢。。。。。用我项目中的一个实例来说明把!

 

   (基金项目) 由于基金净值每天才更新一次,所以在项目启动的时候到数据库中拿一次数据,然后缓存这个list,同时也把缓存这个list的date保存起来,然后在通过定时器,定时在某个时间点去更新这个list,更新缓存date

 

    由于list每天才更新一次,那么前端页面输出这个list的数据也要一天才会变化一次,为了减缓服务器的压力,页面也能缓存起来。

 

 

个人理解原理:

 

                   

 

可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的

Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面

是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面

是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。

 

在看看源码:

/**
	 * 
	 * @param lastModifiedTimestamp 缓存list的时间戳
	 * @return 是否大于缓存list的时间戳
	 */
	public boolean checkNotModified(long lastModifiedTimestamp) {
		if (lastModifiedTimestamp >= 0 && !this.notModified &&
				(this.response == null || !this.response.containsHeader(HEADER_LAST_MODIFIED))) {
			long ifModifiedSince = getRequest().getDateHeader(HEADER_IF_MODIFIED_SINCE);//取得客户端传上来的时间戳  if-modified
			this.notModified = (ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000));
			if (this.response != null) {
				if (this.notModified) {//大于
					this.response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); //往响应流中状态设为305 
				}
				else {
					this.response.setDateHeader(HEADER_LAST_MODIFIED, lastModifiedTimestamp); //把最新的缓存时间戳赋给响应流中的 Last-Modified
				}
			}
		}
		return this.notModified;
	}

 

上面这个类在  org.springframework.web.context.request.ServletWebRequest

 

然后在controller中调用:

 

	@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
	public HashMap getFundNavInfoList(WebRequest webRequest,HttpServletRequest request,FundNavInput in) throws Exception {
		//check is modify  true代表客户端是最新的,直接返回,客户端根据响应流中304取本地缓存
		if(webRequest.checkNotModified(lastModifyTime)){
			return null;
		}
		//.........后面是代码不重要。。。。
}

 总结:

这种方式适合数据更新频率慢,如果是实时数据,这种方式就不行了。。。。。。

 

欢迎大伙指出不足地方!。。。 

  • 大小: 148 KB
3
0
分享到:
评论
3 楼 FX夜归人 2013-11-06  
你好,想问下对于“(lastModifiedTimestamp / 1000 * 1000)”是啥思想呢?谢谢
2 楼 jiana227 2012-07-23  
lastModifiedTimestamp 缓存list的时间戳如何取得啊
1 楼 mercyblitz 2010-08-14  
这个可以交给前段的类似于Apache这样东西来做,建议不要用Java来做。

相关推荐

    前端开源库-less-modify-var-loader

    总结来说,less-modify-var-loader是前端开发中一个实用的Webpack加载器,专门用于在构建过程中动态替换Less预处理器中的变量,使得主题定制和环境适配变得更加便捷。通过合理利用这个工具,开发者可以更高效地管理...

    Ajax 缓存问题,Ajax 缓存问题

    需要注意的是,过度依赖缓存或者完全禁用缓存都可能导致性能问题,因此在处理Ajax缓存时,应当权衡用户体验和数据实时性之间的平衡。同时,对于动态更新的数据,服务端也应该提供恰当的版本控制或者ETag机制,确保...

    modify-GA-code.zip_Modified

    综上所述,这个"modify-GA-code.zip_Modified"压缩包包含了一个经过修改的遗传算法的实现,涉及到了遗传算法的基本流程和核心操作的改进,如交叉、变异和选择策略。通过分析和理解这些文件,我们可以学习如何根据...

    modify-http-headers Chrome插件-20190820

    "modify-http-headers"是一款针对Google Chrome浏览器的插件,主要功能是允许用户自定义和修改HTTP请求头,以满足特定的测试、调试或者隐私需求。这款插件在2019年8月20日的版本被提及,可能是该版本的一个更新或...

    2.4.11-packet-tracer---modify-single-area-ospfv2_zh-CN.pka

    2.4.11-packet-tracer---modify-single-area-ospfv2_zh-CN.pka

    dingshiqi-modify.rar

    在"dingshiqi-modify"这个项目中,很可能就是利用了System.Timers.Timer类来实现的。Timer类提供了一个Elapsed事件,当指定的时间间隔过去后,这个事件就会被触发。开发者可以通过添加事件处理程序到Elapsed事件上来...

    Network-Reinstall-System-Modify-Stable_Version-3.1.1.zip

    总结,"Network-Reinstall-System-Modify-Stable_Version-3.1.1.zip" 提供的是一套全面的云服务器系统重装和优化方案。它简化了运维流程,提升了服务器性能,确保了系统的稳定性和安全性,是云服务器管理者的得力...

    0001-modify-lockScreen-style.zip

    在这个场景中,"0001-modify-lockScreen-style.zip"是一个专门针对锁屏界面进行修改的项目,它包含了两个关键文件:0001-modify-lockScreen-style.patch和0001-modify-lockScreen-style补充.patch。这两个补丁文件是...

    Filename-modify.rar_文件名修改

    这个压缩包文件包含了一个名为"Filename-modify.exe"的可执行程序,用于帮助用户高效地整理和规范他们的文件命名。 文件名的统一性和规范性对于提高工作效率、便于文件检索以及数据管理具有重要意义。在实际工作中...

    Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z

    Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z

    0001-modify-aiti-backup.patch

    开机启动脚本patch......................................................................................

    read-file--modify.zip_Linux 文件监测

    在Linux系统中,对文件进行实时监测和管理是一项常见的任务,尤其在开发和运维场景下。标题"read-file--modify.zip_Linux 文件监测"暗示我们要讨论的是如何在Linux环境下监测文件的变化,并在检测到文件被修改时执行...

    gulp-modify-css-urls:Gulp插件,用于修改CSS URL

    gulp-modify-css-urls Gulp插件,用于修改CSS URL安装npm install --save-dev gulp-modify-css-urls 用法ES2015 /* gulpfile.babel.js */import gulp from 'gulp' ;import modifyCssUrls from 'gulp-modify-css-urls...

    iapws97-modify.rar

    标题中的“iapws97-modify.rar”是一个压缩文件,其中包含了有关IF97(International Formulation 1997 for the Thermodynamic Properties of Water and Steam)标准的C#编程代码。IF97是国际上广泛使用的水和蒸汽...

    struts-1.2.9-modify-by-selfimpr.jar

    此框架的自定义版本 "struts-1.2.9-modify-by-selfimpr.jar" 可能是一位开发者根据自己的需求对原版Struts 1.2.9进行了一些修改或增强,以适应特定项目或功能需求。由于描述中提到的“NULL”和没有具体的修改内容,...

    Hosts-Modify.bat

    Hosts-Modify.bat

    se-modify_一键关闭sebool值_

    总的来说,`se-modify.sh`和`se-modify-2.sh`脚本提供了一种方便的方式来管理和调整SELinux的`sebool`值,但使用它们时需要谨慎,确保符合安全策略,并遵循适当的流程。通过阅读和理解`说明.txt`文件,我们可以更好...

    auto-modify-the-file-names.zip_names

    "auto-modify-the-file-names.zip_names" 提供的工具或脚本显然就是针对这一需求的解决方案。这个压缩包可能包含一个或多个VB(Visual Basic)脚本,用于在当前目录下批量替换文件的名称,以实现快速、高效地管理...

    simple-modify-headers-crx插件

    简单的修改头 该扩展基于规则表重写标头。 可能:添加,修改或删除HTTP(S)请求或响应的标头字段以文件(json格式)导出配置从文件中导入配置... webRequest,webRequestBlocking, ... 支持语言:English (United States)

    liquibase-modify-column-3.1.zip

    总的来说,"liquibase-modify-column-3.1.zip" 和 "liquibase-hibernate.zip" 提供了一个强大的工具链,使得在 Java 开源项目中,特别是在使用 Hibernate 的情况下,管理数据库变更变得高效且可靠。通过深入理解这两...

Global site tag (gtag.js) - Google Analytics