http缓存机制

article/2025/9/11 6:31:05

http缓存机制

  • 1. 什么是缓存
  • 2. 缓存主要目的
  • 3. http缓存概述
    • 3.1 强缓存
    • 3.2 协商缓存

1. 什么是缓存

缓存(cache)是数据交换的缓冲区,是临时存储数据的仓库,在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本并存储在某个相对来说可快速到达、访问、获取的仓库,这样在需要这些数据的时候我们直接从这个仓库中获取数据。

2. 缓存主要目的

(1)提升数据交互的性能(速度);
(2)缓解服务器压力;
(3)减少冗余的数据传输。

3. http缓存概述

当浏览器需要从目标服务器上获取一些资源时,需向目标服务器发送一系列http请求,若应用程序的pv达到百万甚至千万级时,目标服务器压力会很大,此时,http协议给出了一个优化方案:http缓存机制,http缓存可以分为两大类:强缓存和协商缓存。
在浏览器第一次发起请求时,本地无缓存,浏览器向目标服务器发起请求,服务器端响应请求,浏览器端缓存。过程如下:
在这里插入图片描述
浏览器再次请求时,过程如下:
在这里插入图片描述

3.1 强缓存

强缓存只要分为两种情况,Expires和Cache-Control:
Expires的值是服务器告诉浏览器的缓存过期时间(GMT时间,即格林尼治时间),下一次请求时,如果浏览器端的当前时间还没有到达过期时间,则直接使用缓存数据。下面通过Express服务器来设置一下Expires响应头信息:
在这里插入图片描述
在demo.js中添加了一个Expires响应头,第一次请求的时候还是会向服务器发起请求,此时服务器会把过期时间和文件一起返回给我们:
在这里插入图片描述
当刷新页面时可以看到文件是直接从缓存(memory cache)中读取的,并没有发起请求:
在这里插入图片描述
虽然这种方式添加了缓存控制,节省流量,但还是有以下几个问题:
(1)由于浏览器时间和服务器时间不同步,如果浏览器设置一个靠后的时间,过期时间一直没有用;
(2)缓存过期后,不管文件有没有发生变化,服务器都会再次读取文件返回给浏览器。
针对浏览器和服务器时间不同步,加入了新的缓存方案Cache-Control;Cache-Control不是直接告诉浏览器过期时间,而是告诉一个相对时间如Cache-Control=10秒,意思是10秒内,直接使用浏览器缓存:
在这里插入图片描述
在这里插入图片描述

3.2 协商缓存

强制缓存也存在某些弊端,如每次都是根据时间来判断缓存是否过期,当到达过期时间后,如果文件没有改动,再次获取文件会浪费服务器资源。为节省服务器资源,再次改进方案,浏览器和服务器协商,服务器每次返回文件的同时,告诉浏览器文件在服务器上最近的修改时间。请求过程如下:
(1)浏览器请求静态资源demo.js;
(2)服务器读取磁盘文件demo.js,返给浏览器,同时带上文件上次修改时间 Last-Modified(GMT标准格式);
(3)当浏览器上的缓存文件过期时,浏览器携带请求头If-Modified-Since(上一次请求的Last-Modified)请求服务器;
(4)服务器比较请求头里的If-Modified-Since和文件的上次修改时间。如果果一致就继续使用本地缓存(304),如果不一致就再次返回文件内容和Last-Modified;
(5)循环请求。
具体实现如下:
在这里插入图片描述
多次刷新后可以看到请求结果:
在这里插入图片描述
在这里插入图片描述

尽管Last-Modified和If-Modified-Since可以节省服务器资源,但是还是有以下缺点:
(1)由于Last-Modified修改时间是GMT时间,只能精确到秒,如果文件在1秒内有多次改动,服务器并不知道文件有改动,浏览器拿不到最新的文件;
(2)如果服务器上文件被多次修改了但是内容却没有发生改变,服务器需要再次重新返回文件;
为了解决文件修改时间不精确带来的问题,服务器和浏览器再次协商,不返回时间,直接返回文件的唯一标识ETag,只有当文件内容改变时,ETag才改变。请求过程如下:
(1)浏览器请求静态资源demo.js;
(2)服务器读取磁盘文件demo.js,返回给浏览器,同时带上文件的唯一标识ETag;
(3)当浏览器上的缓存文件过期时,浏览器携带请求头If-None-Match(上一次请求的ETag)请求服务器;
(4)服务器比较请求头里的If-None-Match和文件的ETag,如果一致就继续使用本地缓存(304),如果不一致就再次返回文件内容和ETag。
(5)循环请求。
具体实现如下:
在这里插入图片描述
请求结果如下:
在这里插入图片描述
多次刷新页面时:
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/rbd2wRF9.shtml

相关文章

HTTP缓存机制及原理详解(最全)

前言 缓存技术是无数WEB开发从业人员在工作过程中不可避免的一大问题。在产品开发的时候我们总是想办法避免缓存产生,而在产品发布之时又在想策略管理缓存提升网页的访问速度。了解浏览器的缓存命中原理,是开发WEB应用的基础,本文着眼于此&a…

HTTP缓存机制详解

HTTP缓存机制详解 一. 前言二. 缓存的介绍什么是缓存?为什么要使用缓存?1. 减少冗余的数据传输2. 缓解带宽瓶颈3. 破坏瞬间拥塞4. 降低距离时延 三. 缓存有效性命中和未命中的再验证命中率字节命中率区分响应来自缓存还是服务器 四. 缓存拓扑结构私有缓存…

redis消息订阅与发布

一、消息订阅与发布 消息的订阅和发布是进程间的一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。 二、常用命令示例 先订阅后发布,才能收到消息 执行SUBSCRIBE可以一次性订阅多个 执行PUBLISH命令,发布消息 …

redis发布与订阅

一、什么是发布和订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段。特别是在异构(不同语言)系统之间作用非常明显。发布订阅可以是实现应用(系统)之间的解耦合。 发布订阅&…

redis的发布和订阅

1、什么是发布和订阅 redis发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发布消息,订阅者(sub)接收消 息。 redis客户端可以订阅任意数量的频道。 2、redis的发布和订阅 1、客户…

Redis——Redis 的发布和订阅

Redis 的发布和订阅 文章目录 Redis 的发布和订阅1、什么是发布和订阅2、Redis 的发布和订阅3、发布订阅命令行实现 1、什么是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可…

Redis如何实现发布订阅功能

Redis如何实现发布订阅功能 文章目录 Redis如何实现发布订阅功能前言一、Redis发布订阅功能1. 发送消息2. 订阅某个频道3. 发布订阅的实现4. 总结 前言 Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者…

Java实现Redis的发布和订阅

Redis上的操作: 打开两个窗口,打开redis客户端: 一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1 另一个客户端:发布(客户端向channel1频道发送消…

redis 发布订阅以及使用场景

redis 发布订阅 发布订阅模式:一个发布者多个订阅者只要选择订阅这个发布者,发布者发布的数据都可以被订阅到,只有订阅者开始订阅之后,发布的数据才可以接收,也就是说历史数据不能接收 127.0.0.1:6379> PUBLISH 163 hello (i…

Redis---订阅和发布

目录 消息系统命令 消息系统 ​ 发布/订阅,即 pub/sub,是一种消息通信模式:发布者也称为消息生产者,生产和发送消息到存储系统;订阅者也称为消息消费者,从存储系统接收和消费消息。这个存储系统可以是文件系…

Redis:Redis消息的发布与订阅(了解)

为了实现客户端的通信,提供了频道的概念 1.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。 Redis发布订阅示意图 图一:消息订阅者…

Spring boot整合Redis实现发布订阅(超详细)

Redis发布订阅 基础知识相关命令订阅者/等待接收消息发布者/发送消息订阅者/成功接收消息常用命令汇总 原理Spring boot整合redis导入依赖Redis配置消息封装类(MessageDto)Redis配置类测试类订阅方实现一:RedisMessageListener订阅方实现二&a…

【redis】发布和订阅消息

1.说明 在Redis2版本之后支持发布订阅功能,发布者创建一个频道,并在上面发送消息,所有订阅该频道的客户端都能收到消息(不出意外的情况下,但实际不一定),发布订阅的好处是减少不必要的轮询&…

Redis的发布订阅模式

本文源码参看:https://github.com/duktig666/learn-example/tree/5586febea31c2fb368e19fbdba11ed08afd463e0/Redis/src/main/java/cn/duktig/pubsub Redis发布订阅概述 Redis 发布订阅 (publish/subscribe) 是一种消息通信模式:发送者 (pub) 发送消息…

Redis订阅和发布

1.发布和订阅 1.1什么是发布和订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段。特别是在异构(不 同语言)系统之间作用非常明显。发布订阅可以是实现应用(系统)之间的解耦合。…

Redis数据库的订阅发布

大家好,今天分享一下redis的订阅发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 (比如说,你在一个一个网站上面可以关注…

Redis订阅和发布(实操教学)

什么是Redis发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 例1:client2,client5,client1订阅了频道channel1 例2:有新消息通过p…

Redis消息订阅发布

Redis的发布订阅(pub/sub)是一种 消息通信模式 : 发送者(pub)发送消息,订阅者(sub)接收消息 redis客户端可以订阅任意数量的频道 消息发送者 频道 消息接收者 redis频道 channel1 以及订阅这个频道的客户端client2 ; client5 ; client1 之间的关系 当有新消息通过PUBLISH 命…

Redis:发布订阅机制

参考资料: 《Redis进阶——发布订阅详解》 《Redis 发布订阅》 《Redis进阶 - 消息传递:发布订阅模式详解》 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。 目录 一、什…

redis发布订阅

目录 一、概要 二、特点 三、发布及订阅功能 四、Redis发布订阅命令 五、php实现redis发布-订阅 1、消息发布端 2、消息订阅端 六、订阅发布使用场景 七、在订阅时遇到错误 八、模式匹配(正则匹配)订阅 一、概要 Redis发布订阅(pub/sub)是一种…