直白理解一文搞定http协议缓存

本文深入解析HTTP协议中缓存机制的迭代历程,重点介绍HTTP1.1版本中的cache-control及if-match与etag如何协作优化缓存性能,同时对比http1.0版本的缓存控制方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直白理解一文搞定http协议缓存

来源声明

本文来源如下文章,一些实验数据和结论也是基于该文章:
https://mp.weixin.qq.com/s/GkQNZRWIq6MxVE1PeASZkg
作者:vajoy
来源:https://www.cnblogs.com/vajoy/p/5341664.html

前言

由于http协议在缓存机制这一块做了很多次迭代。

并且每次迭代都做了向下兼容(因为如果你不向下兼容,一些顽固的古董的浏览器厂商不愿意升级就会没有支持http协议了。为了迁就他们所以做了向下兼容)

为了我们更好记住最新的,重要的,简单的,常用的缓存机制,我们先讲终点。然后再掘坟,考古。

一.最新的,重要的,简单的,常用的字段

cache-control 控制缓存读写

这个是http1.1的产物

小贴士
http协议有3个版本:
http1.0第一个版本,主要是完成简单的超文本传输
http1.1新增了拓展,缓存机制,绘画保持的长链接,新增状态码,host路由…
http2.0对性能优化,新增多路复用,优化http帧,压缩算…基本上就是优化传输性能,毕竟现在数据越来越大,不优化不行。

在http世界里面,浏览器本地和服务器都有各自的缓存机制,服务器和客户端都可以通过协商控制这两个缓存。

他们就是通过cache-control完成的。
他们可以通过这个指令,来实现,要不要读取缓存,读取多老旧的缓存,还是读取最新数据,也可以实现,要不要写入缓存(客户端和服务器的缓存)。

最常用的指令就是缓存禁用了,直接在请求头或者响应头声明, cache-control:no-store 即可 (no-store表示不写缓存,比较强势,no-cache表示不读取,没那么强势)

Http1.1版本的 if-match和if-none-match 配合 etag 实现缓存改动检验,从而优化缓存性能。

if-match和if-none-match 配合 etag 实现缓存改动检验,从而优化缓存性能。

因为很多时候,缓存时间过期了,并不意味着缓存数据被更新。

所以为了检测数据是否真的被更新。我们会对缓存生产一个类似md5摘要算法的校验码,这个校验码就是etag.

如果校验码一致,自然就不更新了,即使过期时间到了,也不更新缓存

那为什么要搞 if-match和if-none-match 两个指令呢?
他们的区别主要是对状态码进行控制。

先说现象再说结论:
先说现象,读者自己细品。然后说结论,讲我的个人看法,

我们有了etag后,自然就只有两个结果,要么etag识别数据没改动,要么etag识别数据被改动过。

if-match :
改动了返回 200
没改动返回 304

if-none-match:
改动返回 412
没改动返回 200

个人理解:
if-match 侧重于尽可能的读取数据,不惜任何性能代价(就算要远程发起请求也要拿最新数据),不管成功还是没成功,而且越新越好,返回200表示数据是最新的版本。

if-none-match 侧重于性能优先,一定只读缓存,如果读不到就直接412,不读了,感觉这个功能有点鸡肋。

http1.0版本的 if-modified-since 和 if-unmodified-since 配合 last-modified (last-modified 是一个时间戳)

这个是旧版本的,功能跟 Http1.1版本的 if-match 是一个套路的。
唯一的区别是这个http1.0的机制依靠最近更新时间来检测是否被改动,这明显不靠谱,性能显然没有上面基于etag摘要算法那么好。

expire 是 http1.0的机制,其实就是缓存过期机制,这里不讲了。

结论:

大家好好理解 cache-control 和 if-match + etag 机制就好了。

并且记得,禁用缓存的最佳实践是 cache-control:no-store。

基本上就算ok了。

<think>我们正在讨论PLC编程中%MW地址与物理I/O的映射关系。用户要求更直白的解释,所以我们需要用最简单的方式说明。核心概念:%MW是PLC内部的一个存储区域,可以理解为PLC内存中的一个个格子(每个格子16位,即一个字)。物理I/O(如开关、传感器、继电器等)需要和这些格子建立连接,才能被PLC程序读写。映射关系:1.硬件配置时定义:在PLC编程软件中,当我们添加一个I/O模块(比如数字量输入模块、模拟量输出模块)时,软件会自动分配一段%MW地址给这个模块。例如:-一个4通道的模拟量输入模块可能被分配到%MW100到%MW103(每个通道一个地址)。2.自动更新:在每个扫描周期,PLC会自动:-将输入模块的状态(如传感器信号)读取到对应的%MW地址中(例如,传感器信号更新到%MW100)。-将%MW地址中的值(例如%MW200)输出到输出模块(如继电器)。3.程序中使用:在PLC程序中,我们直接读写这些%MW地址,就等于在读写物理I/O。例如:-读取模拟量输入:`温度值:=%MW100;`//这时%MW100里存放的就是传感器传来的温度数字值。-控制数字量输出:`%MW200:=1;`//这会让输出模块的某个通道接通(比如点亮一盏灯)。为什么需要映射?因为PLC程序不能直接操作物理硬件(比如直接读取传感器的电压),必须通过一个中间层(即%MW地址)来交换数据。映射就是给每个物理通道分配一个“信箱”(%MW地址),PLC和硬件通过往这个“信箱”里放信和取信来通信。注意:-不同品牌的PLC地址命名不同(如西门子叫MW,施耐德叫%MW,罗克韦尔叫N7)。-映射关系可以在硬件配置中修改(比如你可以把模拟量输入模块的地址改成%MW500开始)。举例说明:假设我们有一个温度传感器接到PLC的模拟量输入模块的第一个通道上。我们在硬件配置中设置这个模块的起始地址是%MW100。那么:-传感器传来的温度值(比如25°C对应的数字量是1234)会自动被PLC放到%MW100这个地址中。-在程序里,我们只需要写`当前温度:=%MW100;`就可以得到1234这个值。-然后我们可以用这个值做比较、计算等。再比如,我们有一个继电器接到数字量输出模块的第一个通道,模块起始地址是%MW200。那么:-当我们在程序里写`%MW200:=1;`时,PLC就会让这个继电器吸合(通电)。-写`%MW200:=0;`时,继电器断开。简单总结:%MW地址就像PLC和外部硬件(传感器、执行器)之间的“信箱”。映射就是在硬件配置时告诉PLC哪个信箱(%MW地址)对应哪个硬件通道。程序只需要读写信箱,硬件就会自动配合。</think>### PLC中%MW地址与物理I/O映射关系(直白版) #### 🧩 核心概念一句话: > **%MW地址是PLC内存中的"邮箱",物理I/O是外部设备(如传感器/执行器),映射就是给每个设备分配专属邮箱号!** --- ### 🔍 映射关系三步理解: 1. **硬件配置时"贴标签"** 在PLC编程软件中配置I/O模块时,系统自动分配%MW地址: ```mermaid graph LR 物理模块-->|通道1| MW100[%MW100] 物理模块-->|通道2| MW101[%MW101] 物理模块-->|通道3| MW102[%MW102] ``` 2. **扫描周期自动"送信"** PLC每个工作周期(几毫秒)自动完成: - **输入设备 → %MW地址**:传感器数据存入对应"邮箱" ```st 传感器值 := %MW100; // 直接读取邮箱内容 ``` - **%MW地址 → 输出设备**:程序写入邮箱的值发给执行器 ```st %MW200 := 1; // 写入邮箱,继电器自动通电 ``` 3. **地址分配规则** | 模块类型 | 典型映射示例 | 说明 | |----------------|-------------------|--------------------------| | 4通道模拟输入 | %MW100 ~ %MW103 | 每个通道分配一个邮箱 | | 16点数字输出 | %MW200 ~ %MW201 | 每8个点位共享一个邮箱(16位) | | 通信模块数据 | %MW500 ~ %MW550 | 自定义范围 | --- ### ⚠️ 关键注意: 1. **不是固定对应** 就像酒店房号可以调整:%MW100今天接温度传感器,明天可改接压力传感器(需重新配置) 2. **双向传输** - 绿色箭头(→):物理输入 → %MW地址(自动更新) - 红色箭头(←):%MW地址 → 物理输出(程序控制) 3. **实际案例**: ```st // 读取温度传感器(接AI模块通道1) 当前温度 := %MW100; // 直接读对应邮箱 // 控制电机启停(接DO模块通道3) IF 启动按钮 THEN %MW203.2 := 1; // 写入邮箱第3位 END_IF; ``` --- ### 💡 为什么需要映射? > **PLC程序不能直接操作硬件!** > 就像你不能用手直接控制电线,需要通过开关(%MW地址)中转: > ``` > 程序员 → 操作%MW地址 → PLC系统 → 驱动物理设备 > ``` 通过这种映射,PLC程序只需关注%MW地址的值变化,硬件细节由系统自动处理[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值