《HTTP权威指南》 第7章 缓存
带着问题学习:
- 缓存如何提高性能
- 如何衡量缓存的有效性
- 缓存置于何处作用最大
- HTTP如何保持缓存副本的新鲜度
- 缓存如何与其他缓存及服务器通信
web缓存是可以自动保存常见文档副本的HTTP设备。
缓存优点
- 减少冗余的数据传输,节省网络费用
- 缓解网络瓶颈问题,更快加载
- 降低了对原始服务器的要求,服务器更快响应,避免过载
- 降低了距离时延
缓解网络瓶颈
破坏瞬时拥塞
很多人同时访问一个文档,造成过多流量峰值,就会出现瞬时拥塞。
降低距离时延
假设Web页面需要请求20个小图片,支持4个并行连接,每个请求传输需要15ms(直线距离除光速传输速度换算而来),一个来回是30ms。全部请求完成至少需要多少时间?
答案如图所示:
基于TCP慢启动的特性,完全启动4个并发连接需要的来回数:连接1 >> 连接2&3+图片1 >> 连接4+图片2&3 =3
剩余请求需要的来回数:(20+1-3)➗4=5
(需要加上一个web基础页面)
因此总来回数是,3+5=8,至少需要8个完整来回,也就是8*30ms=240毫秒
总结一下完全启动所需的连接并发数(N)最少需要几个来回(m):m = N//2 + 1 if N%2 > 0 else N//2
(如果N不能整除2,就是N整除2加1个来回,否则是N整除2个来回)
命中与未命中
用已有的副本为某些到达缓存的请求提供服务,称为缓存命中
。
其他一些到达缓存的请求没有副本可用,而被转发到原始服务端,称为缓存未命中
。
HTTP再验证
验证缓存是否仍是服务器的最新副本,这些”新鲜度检测
“被称为HTTP再验证。
再验证过程:向原始服务器发送一个小的再验证请求,内容无变化时服务端返回304,缓存标记为暂时新鲜,并将副本返回给客户端,这被称为再验证命中
或缓慢命中
。
请求速度快慢:缓存命中 > 缓存再验证命中 > 缓存再验证未命中 ~ 缓存未命中
(成功的再验证比未命中要快,省去了查询数据和构建响应的过程,但失败的再验证几乎与未命中速度一样)
通常进行再验证会添加If-Modified-Since
首部
再验证未命中时,服务器会回送一条带有完整内容的响应,供缓存更新。
若再验证时发现对象被删除,则服务器返回一个404,缓存收到会将其副本删除。
(文档)命中率
由缓存提供服务的请求所占的比例称为缓存命中率
(或文档命中率)。合理命中率约为40%。
字节命中率
由于文档的尺寸不同,文档命中率不能说明一切,更愿意使用字节命中率作为度量值。
字节命中率表示缓存提供的字节在传输的所有字节中所占的比例。100%字节命中率说明全部来自缓存。
区分命中和未命中
客户端可以通过响应的Date
首部与当前时间判断,日期早说明是缓存。或者通过Age
首部来检测缓存的响应,可分辨出响应的使用期。
缓存的拓扑结构
单个用户专有的缓存为私有缓存
,公共的缓存被称为公有缓存
。
私有缓存
Web浏览器有内建的私有缓存,允许用户自行配置。
公有缓存
公有缓存是特殊的共享代理服务器,被称为缓存代理服务器
(代理缓存)。
代理缓存的层次结构
在缓存层次结构深的情况下,请求可能要穿过很长一溜缓存,每个拦截代理都会增加性能损耗。
各类型缓存
有些网格结构会构建复杂的网状缓存
。网状缓存中的代理缓存会进行更复杂的对话,做出动态缓存通信决策,决定与哪个父缓存对话,或者绕开缓存直接连接原始服务器,这种代理缓存可称为内容路由器
。
内容路由器功能:选择父缓存or原始服务器 >> 选择特定父缓存 >> 在前往父缓存前搜索本地副本 >> 允许其他缓存对其缓存的部分内容进行访问
缓存之间允许不同组织互为对等实体,提供可选的对等支持的缓存称为兄弟缓存
,但HTTP并不支持兄弟缓存,所以有额外的协议对HTTP进行了扩展,比如因特网缓存协议ICP和超文本缓存协议HTCP。
缓存的处理步骤
大多数缓存都会保存缓存命中和未命中数据的统计数据,将条目插入一个用来显示请求类型、URL和所发生事件的日志文件。
缓存处理流程图
保持副本的新鲜
文档过期首部
HTTP让原始服务器向每个文档附加一个过期日期Cache-Control
首部和Expires
首部
缓存过期前,可以以任意频率使用这些副本,除非客户端请求阻止提供已缓存或未验证资源的首部,过期后必须与服务器进行核对。
过期日期和使用期
Cache-Control
首部使用的是相对时间而非绝对日期,绝对日期依赖计算机时钟的正确设置,一般更倾向于用相对时间的Cache-Control
首部。
服务器再验证
HTPTP协议要求行为正确的缓存返回下列内容之一:
- 足够新鲜的已缓存副本
- 再验证后仍然新鲜的已缓存副本
- 再验证时发现原始服务器故障,返回一条错误报文
- 附有金高信息说明内容可能不正确的已缓存副本
用条件方法进行再验证
HTTP定义了5个条件请求首部,最有用的是If-Modified-Since
(IMS)和If-None-Match
。
If-Modified-Since:Date再验证
If-Modified-Since
为真表示文档被修改了,服务器返回新首部的新文档和新的过期时间给缓存,没修改过为假,会返回一个新的过期日期。可以与Last-Modified
首部配合工作。
判断的时候是将IMS日期于最后修改日期进行字符串匹配(即判断更新日期是否一致),是“如果最后的修改不是在这个确定的日期进行的”,而不是“如果在这个日期之后没有被修改过”。
If-None-Match:实体标签再验证
遇到下方的场景通常用If-None-Match
实体标签再验证:
- 有些文档会被周期性写入,内容没有变化,但修改日期改变了
- 文档可能被修改了,但该改动不重要
- 有些服务器无法准确判定其页面的最后修改日期
- 有些文档会以亚秒(一秒的十亿分之一)间隙发生变化,以一秒为粒度的修改日期可能不够用
If-None-Match
通过服务器返回的实体标签(ETag
)再验证。
也可以在If-None-Match
首部包含几个实体标签,逗号隔开,表示缓存已存在这些实体标签的对象副本。
If-None-Match: "v2.6"
If-None-Match: "v2.4","v2.5","v2.6"
If-None-Match: "foobar","A34FAC0095","Profiles in Courage"
强弱验证器
实体标签和最近修改日期都是缓存验证器
。HTTP/1.1支持弱验证器,表示进行了少量修改,声明是“足够好”的等价体。服务器用“W/
”标识弱验证器。
ETag: W/"v2.6"
If-None-Match: W/"v2.6"
什么时候使用实体标签和最近修改日期
- 服务器只回送了一个
Last-Modified
最后修改日期,则客户端用If-Modified-Since
验证 - 服务器只回送了
Etag
实体标签,客户端用If-None-Match
验证 - 实体标签和最后修改日期都提供了,则都进行验证
控制缓存的能力
缓存多长时间,按照优先级递减的顺序,服务器可以:
- 附加一个
Cache-Control: no-store
首部到响应中去; - 附加一个
Cache-Control: no-cache
首部到响应中去; - 附加一个
Cache-Control: must-revalidate
首部到响应中去; - 附加一个
Cache-Control: max-age
首部到响应中去; - 附加一个
Expires
日期首部到响应中去; - 不附加过期信息,让缓存确定自己的过期日期。
no-store
首部(禁止复制响应)和no-cache
首部(新鲜度再验证前不能返回缓存)可以防止缓存提供未经证实的已缓存对象。
must-revalidate
表示严格遵循过期时间,到期要进行再验证,验证通过才发送副本。
max-age
最长可以处于新鲜状态的秒数,为0则不缓存,如:Cache-Control: max-age=0
。s-maxage
类似,但仅适用于公有缓存。
不推荐使用Expires
绝对日期作为过期日期
试探性过期
服务器没有提供过期相关的首部,缓存可以使用任意算法(比如LM-Factor)计算出一个试探性的最大使用期,但如果大于24小时,则应该添加一个试探性过期警告13。(默认的新鲜周期通常是一小时或一天)
客户端的新鲜度设置
相关文章:
《HTTP权威指南》 第7章 缓存
带着问题学习: 缓存如何提高性能如何衡量缓存的有效性缓存置于何处作用最大HTTP如何保持缓存副本的新鲜度缓存如何与其他缓存及服务器通信 web缓存是可以自动保存常见文档副本的HTTP设备。 缓存优点 减少冗余的数据传输,节省网络费用缓解网络瓶颈问题&…...
【Zephyr 系列 28】MCU 闪存文件系统详解:LittleFS + NVS + 块设备设计实战
🧠关键词:Zephyr 文件系统、LittleFS、NVS、Flash 分区、嵌入式存储、断电保护、wear leveling 📌 1. 为什么 MCU 上需要文件系统? 在嵌入式开发中,很多开发者起初直接操作 Flash 保存参数,但随着需求增长…...
ICML 2025 | 时间序列(Time Series)论文总结
ICML 2025将在2025年7月13日至7月19日(周六)在温哥华会议中心举行,本文总结了ICML 2025有关时间序列(Time Series)相关文章,共计63篇。 时间序列Topic:预测,分类,异常检测,生成&…...
理解后端开发中的中间件(以gin框架为例)
中间件(Middleware)是后端开发中的一个核心概念,它在请求(Request)和响应(Response)之间扮演着桥梁角色。以下是关于中间件的详细解释: 基本概念 中间件是在请求到达最终处理程序之前或响应返回客户端之前执行的一系列函数或组件。它可以: 访…...
【分布式技术】Bearer Token以及MAC Token深入理解
Bearer Token以及MAC Token深入理解 **Bearer Token 详解****1. 什么是 Bearer Token?****2. Bearer Token 的构建详情****(1)生成流程****(2)Token 示例(JWT)****(3)Tok…...
WebRTC(七):媒体能力协商
目的 在 WebRTC 中,每个浏览器或终端支持的音视频编解码器、分辨率、码率、帧率等可能不同。媒体能力协商的目的就是: 确保双方能“听得懂”对方发的媒体流;明确谁发送、谁接收、怎么发送;保障连接的互操作性和兼容性。 P2P的基…...
(线性代数最小二乘问题)Normal Equation(正规方程)
Normal Equation(正规方程) 是线性代数中的一个重要概念,主要用于解决最小二乘问题(Least Squares Problem)。它通过直接求解一个线性方程组,找到线性回归模型的最优参数(如权重或系数ÿ…...
【机器学习】数学基础——标量
目录 一、标量的定义 二、标量的核心特征:无方向的纯粹量级 2.1 标量 vs 矢量 直观对比 三、 标量的数学本质:零阶张量 3.1 张量阶数金字塔 3.2 标量的数学特性 四、 现实世界的标量图谱 4.1 常见标量家族 4.2 经典案例解析 五、 标量的运算奥秘…...
基于python代码的通过爬虫方式实现TK下载视频(2025年6月)
Tk的视频页面通常需要登录才能获取完整数据,但通过构造匿名游客的请求,我们可以绕过登录限制,提取视频的元信息(如标题、ID和播放地址)。核心思路如下: 构造匿名Cookie:通过模拟浏览器的请求,获取Tk服务器分配的游客Cookie。解析网页:利用BeautifulSoup解析HTML,定位…...
Go 语言的堆糖图片爬虫
基于 Go 语言的堆糖图片爬取探索之旅 在互联网的浩瀚海洋中,堆糖网以其丰富多样的高清图片、美图壁纸等内容吸引了众多用户。对于图片爱好者来说,能高效获取心仪的图片资源无疑是一件极具吸引力的事情。今天,就带大家走进一段基于 Go 语言的…...
python+uni-app基于微信小程序的儿童安全教育系统
文章目录 具体实现截图本项目支持的技术路线源码获取详细视频演示:文章底部获取博主联系方式!!!!本系统开发思路进度安排及各阶段主要任务java类核心代码部分展示主要参考文献:源码获取/详细视频演示 ##项目…...
DAY 39 图像数据与显存
图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader ,…...
ELK搭建
1、elasticsearch和kibana搭建配置见 https://blog.csdn.net/yh_zeng2/article/details/148812447?spm1001.2014.3001.5501 2、logstash 下载 下载和elasticsearch版本一致的logstash,下载地址: Past Releases of Elastic Stack Software | Elastic …...
【ELK(Elasticsearch+Logstash+Kibana) 从零搭建实战记录:日志采集与可视化】
ELK(ElasticsearchLogstashKibana) 从零搭建实战记录:日志采集与可视化 本文记录了我在搭建ELK(Elasticsearch, Logstash, Kibana)技术栈时的完整实战过程。使用Docker Compose快速搭建了ELK服务端(监控主机),并通过Filebeat实现…...
反无人机系统:技术利刃如何守护低空安全?
反无人机系统:技术利刃如何守护低空安全? ——从军事防御到城市安防的全景解析 一、技术体系:从“电磁软杀伤”到“激光硬摧毁”的立体防御网 反无人机技术本质是一场“降维打击”:用百万级防御系统对抗千元级消费无人机。当前…...
第十章——8天Python从入门到精通【itheima】-102-Python基础综合案例-数据可视化(pyecharts的入门使用+数据处理)
目录 102节——pyecharts的入门使用 1.学习目标 2.pyecharts入门——基础折线图 3.pyecharts的配置对象有哪些? 4.全局配置——set_global_opts 5.小节总结 103节——数据处理 1.学习目标 2.无法继续关于第一阶段的pyecharts的相关学习 因为关于JSON数据获…...
Neo4j 中存储和查询数组数据的完整指南
Neo4j 中存储和查询数组数据的完整指南 图形数据库 Neo4j 不仅擅长处理节点和关系,还提供了强大的数组(Array)存储和操作能力。本文将全面介绍如何在 Neo4j 中高效地使用数组,包括存储、查询、优化以及实际应用场景。 数组在 Neo4j 中的基本使用 数组…...
云原生/容器相关概念记录
文章目录 网络与虚拟化技术云平台与架构容器与编排容器网络方案性能优化与工具硬件与协议 网络与虚拟化技术 P4可编程网关 P4: Programming Protocol-independent Packet Processors一种基于P4语言的可编程网络设备,支持自定义数据包处理逻辑。P4可编程技术详解&am…...
uni-app项目实战笔记21--uniapp缓存的写入和读取
一、缓存的写入 uni.setStorageSync("storageClassList",classifyList.value) 二、缓存的读取,如果缓存不存在,则返回空数组 const storageClassList uni.getStorageSync("storageClassList") || []; 三、对读取到的数据进行转…...
操作系统概述
覆盖了操作系统概述、运行机制、中断、异常、操作系统的五大结构、虚拟机。 借鉴:王道、我的好朋友杨某、我的笔记。 一、操作系统概念 概念 1.操作系统体现了封装思想 由于底层硬件只接受二进制的指令不方便用户操作,所以操作系统把这些封装成简易的…...
探索数据的力量:Elasticsearch中指定链表字段的统计查询记录
目录 一、基本的数据结构说明 二、基本的统计记录 (一)统计当前索引中sellingProducts的所有类型 (二)检索指定文档中sellingProducts的数据总量 (三)检索指定文档中sellingProducts指定类型的数量统计…...
【Datawhale组队学习202506】YOLO-Master task03 IOU总结
系列文章目录 task01 导学课程 task02 YOLO系列发展线 文章目录 系列文章目录前言1 功能分块1.1 骨干网络 Backbone1.2 颈部网络 Neck1.3 头部网络 Head1.3.1 边界框回归头1.3.2 分类头 2 关键概念3 典型算法3.1 NMS3.2 IoU 总结 前言 Datawhale是一个专注于AI与数据科学的开…...
C/C++数据结构之静态数组
概述 静态数组是C/C中一种基础的数据结构,它允许用户在编译时便确定数组的大小,并分配固定数量的连续存储空间来存放相同类型的元素。静态数组的主要特点是:其大小在声明时就必须指定,且在其生命周期内保持不变。这也意味着&#…...
pyqt f-string
文章目录 一、f-string的基本语法二、代码中的具体应用拼接效果 三、f-string的核心优势四、与其他字符串格式化方式的对比五、在Qt程序中的实际作用六、扩展用法:在f-string中添加格式说明 Python的 f-string(格式化字符串字面值) 特性&…...
夏普 AR-2348SV 打印机信息
基本信息:这是一款黑白 A3 激光多功能数码复合机,可实现打印、复印、扫描功能。性能参数 打印 / 复印速度:23 张 / 分钟。分辨率:600x600dpi,能确保文字和图像清晰。最大打印 / 复印尺寸:A3。纸张支持&…...
跨个体预训练与轻量化Transformer在手势识别中的应用:Bioformer
目录 一、从深度学习到边缘部署,手势识别的新突破 (一)可穿戴设备 边缘计算 个性化医疗新可能 (二)肌电信号(sEMG):手势识别的关键媒介 (三)挑战&#…...
探索常识性概念图谱:构建智能生活的知识桥梁
目录 一、知识图谱背景介绍 (一)基本背景 (二)与NLP的关系 (三)常识性概念图谱的引入对比 二、常识性概念图谱介绍 (一)常识性概念图谱关系图示例 (二)…...
人人都是音乐家?腾讯开源音乐生成大模型SongGeneration
目录 前言 一、SongGeneration 带来了什么? 1.1 文本控制与风格跟随:你的想法,AI 精准实现 1.2 多轨生成:从“成品”到“半成品”的巨大飞跃 1.3 开源:推倒“高墙”,共建生态 二、3B 参数如何媲美商业…...
一,python语法教程.内置API
一,字符串相关API string.strip([chars])方法:移除字符串开头和结尾的空白字符(如空格、制表符、换行符等),它不会修改原始字符串,而是返回一个新的处理后的字符串 chars(可选)&…...
python中学物理实验模拟:凸透镜成像和凹透镜成像
python中学物理实验模拟:凸透镜成像和凹透镜成像 凸透镜成像 凸透镜是指中间厚、边缘薄的透镜。它对光线有会聚作用,即光线通过凸透镜后会向主光轴方向偏折。 成像原理 基于光的折射,平行于主光轴的光线经凸透镜折射后会聚于焦点ÿ…...
【AGI】突破感知-决策边界:VLA-具身智能2.0
突破感知-决策边界:VLA-具身智能2.0 (一)技术架构核心(二)OpenVLA:开源先锋与性能标杆(三)应用场景:从实验室走向真实世界(四)挑战与未来方向&…...
2D曲线点云平滑去噪
2D曲线点云,含许多噪声,采用类似移动最小二乘的方法(MLS)分段拟合抛物线并投影至抛物线,进行点云平滑去噪。 更通俗的说法是让有一定宽度的曲线点云,变成一条细曲线上的点。 分两种情况进行讨论: 1&#…...
靶场(二十一)---小白心得靶场体会---DVR4
先看端口,看到了一个dvr的服务,老规矩只要有服务就先去看看 PORT STATE SERVICE VERSION 22/tcp open ssh Bitvise WinSSHD 8.48 (FlowSsh 8.48; protocol 2.0; non-commercial use) | ssh-hostkey: | 3072 21:25:f0:53:b4…...
Qt + C++ 入门2(界面的知识点)
补充前面没有说到的一点就是,qt的页面你可以用qt自带的也就是前面所说的自动生成.UI文件生成前端所谓的界面,然后往里面拖控件就可以了,这个UI界面非常的适合用于新手,以及某些软件少量的界面应用 。但是有一个难点就是后期这个UI…...
计算机网络第九章——数据链路层《流量控制和可靠传输》
一、回顾概念 前面上一章讲了数据链路层的《差错控制》,那么回顾一下差错控制和可靠传输的区别: 差错控制:发现一个帧里的【位错(比特错)】 检错(奇偶校验码、CRC循环冗余校验码):接…...
Zephyr 调试实用指南:日志系统、Shell CLI 与 GDB 全面解析
本文深入讲解 Zephyr 的调试利器,包括统一日志系统(logging subsystem)、内置命令行(Shell CLI)、与 GDB 调试集成方法,帮助开发者快速定位问题、分析运行时行为,实现高效开发与排障。 一、日志…...
【知识图谱提取】【阶段总结】【LLM4KGC】LLM4KGC项目提取知识图谱推理部分
文章目录 前言LLM4KGC的三个部分显卡使用效果前言 之前在学习基于大模型的知识图谱提取,就找到了LLM4KGC这个项目: 项目地址: https://github.com/ChristopheCruz/LLM4KGC/ 总体来说,这个项目没有什么比较高深的idea,年份也比较古老,但确实挺适合入手的。主要是绝对简…...
基于YOLO的智能车辆检测与记录系统
基于YOLO的智能车辆检测与记录系统 摘要 本报告总结了智能车辆检测系统的开发工作,主要包括车辆数据标注、YOLO模型训练及QT交互系统搭建三部分。通过使用专业标注工具完成车辆目标数据集的标注与预处理,基于YOLO模型构建车辆检测算法并优化训练流程&a…...
5.2 Qt Creator 使用FFmpeg库
一、目录结构 ├─3rdparty # 第三方依赖库 │ └─ffmpeg-4.4.3 # ffmpeg库 │ ├─mingw # 用MinGW64编译的库 │ │ ├─bin │ │ ├─include │ │ └─lib │ └─msvc # 用MSVC编译的库 │ ├─bin │ …...
C++基础练习 sort函数,用于排序函数
题目: https://acm.hdu.edu.cn/showproblem.php?pid2039 解答: #include <iostream> #include <cmath> #include <algorithm> using namespace std;double a[3]; int main(){int n;cin>>n;while(n--){cin>>a[0]>>…...
【Docker 08】Compose - 容器编排
🌈 一、Docker Compose 介绍 ⭐ 1. Docker Compose 是什么 Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具,它让用户可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务&…...
docker执行yum报错Could not resolve host: mirrorlist.centos.org
解决办法: -- 依次执行以下命令cd /etc/yum.repos.d/sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.org|g /etc/yum.repos.d/CentOS-*sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*yum update -yecho "export LC_ALL…...
信贷域——信贷授信业务
摘要 本文详细介绍了信贷授信业务,包括其核心目标、典型流程、不同机构授信流程的对比、授信业务的其他类型以及授信模块的技术实现。信贷授信是金融机构在放贷前对客户信用额度的评估与审批流程,旨在控制风险、合理设定额度和期限、确保合规࿰…...
python的校园兼职系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
深度剖析 PACK_SESSIONID 实现原理与安全突破机制
🌐 深度剖析 PACK_SESSIONID 实现原理与安全突破机制 🖼️ 1. 完整数据处理流程 #mermaid-svg-TW7jVIcz81hCZVS9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TW7jVIcz81hCZVS9 .error-ico…...
从0开始学习计算机视觉--Day02--数据驱动
上次我们在课程里了解到,亚马逊网站在当时构建了一个在那时候最大的供AI训练的数据集,为了推广这个测试,他们举办了比赛邀请了许多的参赛者,识别图片的标准是输出的类别中只要在前面五个里包含了正确答案就算识别成功。在这个过程…...
【LeetCode#第198题】打家劫舍(一维dp)
198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&#…...
stm32串口(uart)2转发到串口(uart)3实现
今天博主在用kelil5写stm32的程序时遇到了一个全局变量因为在中断和任务切换时没有加 volatile 修饰,导致任务检测不到标志位变化,无法实现效果的问题。 全部代码: /* USER CODE BEGIN Header */ /***************************************…...
数据结构——函数填空题
链队出队入队 入队:新指针p赋给队尾的下一个,再赋给队尾 出队:队首指针赋给p,后移 p的下一个赋给队首指向的下一个 若队尾p,则证明首尾相连为1个 字符串匹配算法 二叉树 统计二叉树度为1的节点 树T为空࿰…...
什么是跨域问题?后端如何解决跨域问题?
跨域问题是指浏览器为了安全,对不同域(包含不同协议、不同端口或不同主机名)的请求进行限制,从而导致请求无法正常访问后端接口。 跨域问题的产生源于浏览器的同源策略(Same-Origin Policy),这…...