简介
ETAG在HTTP协议中的定义是资源实体的标记(entity tag),强标识一个资源。是缓存过期的一种代替方案(IF-MODIFIED-SINCE,IF-UNMODIFIED-SINCE)。服务器端资源一旦改变,ETAG值需要跟着改变。但是协议没有规定ETAG的计算方法,可以任意实现。一般对应静态资源(静态URL或文件)采用MD5摘要方式较好。
ETAG与IF-MATCH,IF-NONE-MATCH配合实现缓存方案,代替IF-MODIFIED-SINCE,IF-UNMODIFIED-SINCE(另外)
资源(Resource):URL唯一标识的资源,一个URL对应一个资源。
实现原理
- 服务器端创建资源,生成ETAG,每次修改也更新ETAG。
- 客户端首次访问资源,服务器返回资源实体内容和在头区中返回ETAG值,客户端保存实体内容和ETAG值。
- 客户端再次访问资源的时候,在头域(header)中加入“If-match:etag值”指令。
- 服务器接受到请求后,检查资源的ETAG值是否与请求的If-match指定的etag值相同(强匹配),如果匹配则响应304 Not Modified,表示资源未改变,客户端可以直接使用前面请求中保存的资源,如果不匹配才返回资源实体(entity,也就是body体).或者:客户端再次访问资源的时候,在header中加入“If-None-Match:etag值”,如果服务器的ETAG值匹配客户端请求 的etag值则返回412,表示条件冲突,不匹配则返回实体内容。
- 客户端继续使用缓存的资源。
-
If-Match:匹配则返回实体内容,否则响应307,不返回实体内容。
-
If-None-Match:不匹配则返回实体内容,否则响应412错误。
ETag比Last-Modified和
Expires
的优势
Last-Modified和Expires都是时间作为判断资源是否改变的标志存在一些隐患。
- 在秒级以内多次修改,Last-Modified和Expires无法表示出来,因为Last-Modified和Expires最小粒度为秒级。
- 对资源多次修改,但是最后又修改回最初的内容,实际上内容并没有改变。
- ETag值是根据实际内容变更才更新,所以可以更准确的标志资源。
实际应用
云存储中最为文件的tag,标记文件是否改变。一般使用MD5判断文件是否改变,也可以直接使用MD5值作为ETAG值。
问题:对大文件,修改一小部分内容后,更新ETAG,从新计算MD5,效率太低,解决方案啊~?
分享到:
相关推荐
NULL 博文链接:https://hyj1254.iteye.com/blog/1161000
精品软件工具--系统工具:手机检测,缓存清理,进程释放与软件管理
:books: :satellite_antenna: HTTP Apollo链接,具有由数据加载器提供的批处理和缓存。 理念 一个Apollo链接,可同时在Node和Browser中批量处理请求。 您可能会问与什么区别。 该库没有像apollo-link-batch-http...
世博会托管工作流的缓存图像组件 :gear: 安装 yarn add react-native-expo-cached-image :rocket: 快速开始 import CachedImage from 'react-native-expo-cached-image' ; // In render() CachedImage组件...
1、缓存优化(读缓存) 2、分布式环境下,写操作:集群分布式环境下,服务必须使用第三方的锁,因此要使 用分布式锁 * 数据库锁 * Redis 锁 * zookeeper 锁 3、缓存扣减库存 1 缓存优化 未优化之前: tps 情况 业务...
无服务器API网关缓存 介绍 无服务器框架的插件,可帮助配置API Gateway端点的缓存。 快速开始 如果启用全局缓存,它不会自动启用缓存为您的终端-你必须明确了解哪些终端应该启用缓存。 但是,全局禁用缓存会在端点...
dio-http缓存 Dio-http-cache是的缓存库 ,就像Android中的一样。 Dio-http-cache使用作为磁盘缓存,使用策略作为内存缓存。 受启发。 添加依赖 dependencies : dio_http_cache : ^0.2.x # latest version 快速...
Web协议详解与抓包实战
系统工具-文件下载-缓存优化软件(Outertech Cacheman) 10.50.zip
简单的基于ETag的$http服务请求缓存! 增加响应速度,减少带宽使用。 缓存ETag标头,并通过If-None-Match标头将它们发送回服务器。 使用灵活的缓存配置来缓存响应数据。 支持$cacheFactory , sessionStorage和...
使用LRU缓存,以便透明地将http.Agent实例重新用于对同一代理服务器的后续HTTP请求。 下表列出了当前实现的协议映射: 协议 http请求的代理 https请求的代理 例子 http http://proxy-server-over-tcp.com:3128 ...
git-cache-http-server:缓存Git HTTP服务器
React本地视频缓存提升在线视频加载和缓存的性能使用以下库进行繁重的工作。 iOS: : Android: : 入门$ yarn add react-native-video-cache 大多是自动安装$ react-native link react-native-video-cache 用法 ...
http-代理缓存 缓存 HTTP 转发代理。 特征: 100% 透明 保持与 Google Chrome 类似的一致标题顺序(参见 index.js 中的headerOrder ) 确保发送到目标的所有标头都正确区分大小写(例如User-Agent而不是user-...
第16章 微服务之缓存16.1 Guava Cache本地缓存16.1.2 代码示例16.1.3 回收策略16.2.1 用Redistemplate操作Redi
cloudflare-purge-action::wastebasket_selector:GitHub通过Cloudflare API清除网站缓存的操作
包含了常用的MySQL、Redis、RocketMQ、Kafka、Elasticsearch、PostgreSQL、ZooKeeper、Nacos、配置...* query-cache-type:用于控制缓存的类型,必须设置为数字,0:禁用,1:缓存所有结果,2:只缓存指定需要缓存的查询
Vue路由器保持活动帮助器 Vue Router Keep-alive Helper是用于管理Vue.js项目中的缓存页面的自动工具,只能使用一行配置代码。 English |为什么需要此帮手: 当使用vue-router开发Vue.js的SPA项目时, 总是用于缓存...
Go的缓存控制中间件添加ETag头(内容的md5)和Cache-Control头
弹簧缓存拦截器 :leaf_fluttering_in_wind: SpringFramework的缓存拦截器 :copyright:Pongnathee Kluaythong / 123RF.COM要求Java 8或更高版本Spring框架支持的Spring Framework版本Spring Framework版本Spring Boot...