首页 > 其他分享 >基于HTTP协议的客户端缓存

基于HTTP协议的客户端缓存

时间:2023-09-14 15:04:09浏览次数:47  
标签:缓存 HTTP since modified Etag 服务器 客户端


提到缓存,一般都会想起redis、memcached等分布式缓存系统。虽然使用这些服务器端缓存速度能提升不少,但其实还是需要客户端下载这部分数据,目前在移动互联网领域,节省流量是很有必要的,因此工作中也就需要加入客户端缓存的相关技术。

 

怎么使用客户端缓存?

1、用http报头中的last-modified和if-modified-since属性:

客户端请求某个URL的页面时,服务器响应200的同时会下发一个last-modified属性表明请求页面的最后更新时间。

客户端再次请求服务器时,根据http协议会在报头添加if-modified-since属性,询问请求页面是否被更新过。

如果服务器端没有更新过请求的页面,则自动响应http 304(not changed)状态码,而响应的Body为空,从而减少了数据传输。

如果服务器更新过了请求的页面,则会将最新的数据响应给客户端。

因此,只要客户端将第一次服务器响应的数据和last-modified在本地存起来,以后的请求在if-modified-since中使用原先存储的时间,如果遇到了响应http 304就直接读本地存储的数据,如果不是304就及时更新本地存储的数据就行了。这样能比每次请求都拉取数据要节省很多流量。

2、关于Etag:

Etag主要为了解决last-modified无法解决的一些问题。

(1)一些文件的内容并不改变,仅仅改变修改时间。

(2)文件在1s内修改了N次,if-modified-since能检查到的粒度是秒级的,这种修改无法判断。

(3)服务器不能精确的得到文件的最后修改时间;

与last-modified类似:

首先,客户端第一次请求时,服务器计算好etag并返回给客户端。客户端保存etag信息和响应数据,再次发送请求时发一个If-None-Match头,并包含上次服务器响应的etag值。

其次,服务器判断发送过来的Etag和计算出来的Etag匹配,如果If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;

如果同时使用if-modified-since和If-None-Match,会在完全匹配if-modified-since和If-None-Match之后,服务器才能返回304。

 

关于Etag的几篇参考资料:

 使用ETags减少Web应用带宽和负载

  Etag与HTTP缓存机制

http://www.iteye.com/topic/656658  HTTP协议缓存策略深入详解之etag妙用

 

标签:缓存,HTTP,since,modified,Etag,服务器,客户端
From: https://blog.51cto.com/u_6978506/7470422

相关文章

  • 开源消息中间件ActiveMQ回顾:Java客户端实现
    前一段时间工作中经常使用到ApacheActiveMQ用作消息传输。今天在公司不是很忙,于是又深入研究了一下,总结一下分享出来。基于ActiveMQ的Java客户端实现例子。接口定义:publicinterfaceMQService{publicvoidstart();publicvoidsendQueueMessage(Stringtext)throws......
  • Nginx神奇的499竟然不在HTTP响应码标准内?快来了解一下!
    1前言高性能的HTTP和反向代理服务器,Nginx用来:搭建WebServer作负载均衡供配置的日志字段丰富,从各类HTTP头部到内部性能数据都有Nginx的访问日志中,存在499状态码的日志。但常见4xx状态码只有400、401、403、404等,499并未在HTTPRFC文档。这499错误日志,在流量较大场景下,特别......
  • 146. LRU 缓存
    请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalue)如果......
  • 核桃云监控:https://jk.htyun.net/
    今天给大家推荐一款非常好用的网站监测平台,也是我一直再用的,它就好比给自家的网站上雇了一个管家,它可以替我24小时不间断端的扫描网站,如果出现宕机,或者因为网络还是其他问题打不开时,系统会自动发送报警来提醒我,这样就节省了我的大部分时间,而我就不用时不时去自己去登录网站检查了,......
  • 关于缓存系统的mutex模式实现
    这篇blog是在上一家互联网公司某产品开发过程中的一些经验总结,整理一下分享上来。 关于mutex模式:对于高并发大访问量的应用,一般都会在数据库访问前加一层缓存系统。但是如果某一时刻某个缓存的key失效,而reload该key缓存的时间又比较长,导致大量的请求直接访问数据库,则会直接将数据......
  • java/jsp清除jsp缓存
    InJava:HttpServletResponseresponse=(HttpServletResponse)rep;response.setDateHeader("Expires",-1);response.setHeader("Cache_Control","no-cache");response.setHeader("Pragma","no-ca......
  • 计算机网络HTTP与TCP常见知识点思维导图
    本篇思维导图主要介绍了HTTP与TCP常见知识点,广度与深度兼具,希望对大家有帮助,需要xmind格式联系我,转发请备注来源,谢谢! ......
  • windows defender怎么关闭https://www.lingfenmao.com/it/2643.html
    工具/原料:       品牌型号:联想昭阳K4e-IML       系统版本:Windows10        关闭windowsdefender放火墙可使用组策略禁用和安全中心两种方法操作,以下为组策略禁用关闭的步骤说明:方法一:组策略禁用法1打开电脑Win+R键打开命令框......
  • http请求头中的Range参数
    http请求头的Range参数是指分段请求字节数.当请求资源文件的时候,可以通过该参数指定获取资源的字节范围.这个字节范围是从0开始到左右闭合区间.例如:Range:bytes=500-999#表示获取资源文件第500个字节到第999个字节的数据.Range参数可以被用于多线程分段下载,断点续传等.......
  • 商品查询业务之解决商品查询的缓存穿透、缓存雪崩、缓存击穿问题(封装工具类)
    商品查询业务之解决商品查询的缓存穿透、缓存雪崩、缓存击穿问题(封装工具类)核心思路如下:在原来的逻辑中,我们如果发现这个数据在mysql中不存在,直接就返回404了,这样是会存在缓存穿透问题的现在的逻辑中:如果这个数据不存在,我们不会返回404,还是会把这个数据写入到Redis中,并且将v......