http缓存

在嵌入式设备中,http请求需要耗费网络资源。受限于网络环境的影响,频繁的http请求会很考验设备的带宽和性能。http缓存是用于在客户端和服务器之间缓存HTTP响应,以提高性能和减少网络传输。

当客户端发送HTTP请求到服务器时,服务器可以通过在响应中添加缓存指令来指示客户端是否可以对该响应进行缓存,并设置缓存的有效期等相关信息。

一般的浏览器请求都支持http缓存,可以先看下浏览器这边是怎么处理的

可以看到在发起http请求时,请求头中是携带了Cache-Control,If-Modified-Since的,在响应头中又包含了Cache-Control、Last-Modified。这些都是http缓存的标识。

http缓存过程分析:

我们在第一次http请求资源后,会获取到请求的结果以及缓存标识,接下来,我们在根据第一次请求返回的响应头来确定缓存处理的方式,分别是强缓存和协商缓存

强缓存:

强缓存是通过设置缓存响应的头字段来实现的,客户端在指定时间内可以直接使用缓存副本,而无需向服务器发送请求。主要使用的头字段有

Cache-Control:通过设置max-age指令来指定资源的有效期(秒)。例如,Cache-Control: max-age=86400表示资源在24小时内有效。
Expires:以绝对时间的方式指定资源的过期时间,与Cache-Control类似,但使用的是时间戳。例如,Expires: Mon, 01 Jan 2024 12:00:00 GMT表示资源在指定时间之前有效。

Expires已经是比较古老的处理方式,有一定的局限性。现在好像已经不怎么用了

Cache-Control是HTTP头字段之一,用于指定缓存的控制策略。它可以包含多个指令,每个指令之间使用逗号分隔。以下是常见的Cache-Control指令及其取值:

public:表示响应可以被任何中间缓存(如代理服务器)缓存,包括客户端缓存和共享缓存。例如:Cache-Control: public

private:表示响应只能被客户端缓存,不允许中间缓存对其进行缓存。例如:Cache-Control: private

no-cache:表示响应不能直接从缓存获取,必须先发送到服务器进行验证。例如:Cache-Control: no-cache

no-store:表示响应和请求的内容都不允许被缓存,每次请求都要向服务器发送并获取最新的响应。例如:Cache-Control: no-store

max-age:设置资源的最大有效期(秒),在过期之前可以直接从缓存获取响应。例如:Cache-Control: max-age=3600表示资源在1小时内有效。

s-maxage:类似于max-age,但只适用于共享缓存(如代理服务器)。例如:Cache-Control: s-maxage=86400表示资源在24小时内对共享缓存有效。

must-revalidate:表示在缓存过期后,客户端必须向服务器发送请求进行验证,以确定缓存是否仍然有效。例如:Cache-Control: must-revalidate

proxy-revalidate:类似于must-revalidate,但只适用于中间缓存(如代理服务器)。例如:Cache-Control: proxy-revalidate

no-transform:表示中间缓存不得对响应的内容进行转换或修改。例如:Cache-Control: no-transform

以上是一些常见的Cache-Control指令和取值,可以根据具体需求设置合适的指令来控制缓存行为。需要注意的是,Cache-Control的指令可以进行组合使用,以满足更复杂的缓存控制需求。

嵌入式中一般不需要这么复杂的场景,用得比较多的就是 no-cache no-store max-age这些,

协商缓存:

协商缓存是通过与服务器进行缓存验证来确定是否可以使用缓存副本。客户端发送条件请求到服务器,验证资源是否发生了变化。主要使用的头字段有:

ETag 和 If-None-Match:服务器给资源分配唯一的标识符(ETag),客户端在下一次请求时通过If-None-Match头字段将该标识符发送给服务器,如果资源未被修改,则服务器返回特殊状态码(如304 Not Modified)。
Last-Modified 和 If-Modified-Since:服务器在响应中添加资源的最后修改时间(Last-Modified),客户端在下一次请求时通过If-Modified-Since头字段将该时间发送给服务器,如果资源未被修改,则服务器返回特殊状态码(如304 Not Modified)。
当客户端发出带有协商缓存的请求时,服务器会根据条件进行验证。如果缓存仍然有效,则返回特殊状态码,客户端可以使用缓存副本。否则,服务器将返回新的响应,包含最新的资源内容。

如果响应头中包含了ETag或Last-Modified则表示这条请求支持协商缓存。返回状态码304时就表示资源没有改变,可以继续使用

这两种缓存的区别点有:

策略不同:强缓存是客户端自行判断缓存是否过期,如果未过期则直接从缓存加载资源,不发送请求。而协商缓存则需要与服务器进行缓存验证,客户端发送条件请求到服务器,验证资源是否发生了变化。

缓存验证方式不同:强缓存通过设置响应头字段(如Expires和Cache-Control),告知客户端缓存多长时间,客户端在下次请求时根据这些信息决定是否直接从缓存中加载资源。而协商缓存则是通过向服务器发送条件请求,服务器根据条件进行缓存验证,如果通过验证,则返回特殊的状态码(如304 Not Modified),客户端可以使用缓存副本,否则返回最新的响应。

有效性不同:强缓存对于缓存副本的有效性判断仅依赖于本地缓存,即使资源已经发生了变化,客户端也会从缓存中获取旧的副本。而协商缓存则通过向服务器发送条件请求进行缓存验证,可以保证返回的响应内容是最新的。

综上所述,强缓存优先级高,客户端在判断缓存是否过期时不需要与服务器通信,可以大大提高性能和效率;而协商缓存需要与服务器进行缓存验证,可以保证返回的响应内容是最新的,但会增加一定的网络开销。因此,根据实际业务需求和用户体验,可以灵活选择使用强缓存、协商缓存,或两者组合使用来控制缓存行为。

在使用http时,可以结合一些策略来使用,比如LRU,LFU策略等

LRU(Least Recently Used)是一种常用的缓存淘汰策略,它根据最近使用的情况来决定哪些缓存项应该被淘汰,以便为新的数据腾出空间。当缓存容量达到上限时,根据以下步骤执行LRU策略:

当有新的数据需要插入缓存时,首先检查该数据是否已经在缓存中。如果已经存在,则将其移动到缓存的最前面,表示最近被访问过。
如果数据不存在于缓存中,则将其插入到缓存的最前面,同时检查缓存是否已满。如果已满,则淘汰最久未被访问的数据,即缓存末尾的数据。

LFU(Least Frequently Used):根据数据的访问频次来决定淘汰。频次最低的数据会被优先淘汰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值