HTTP 网络技术学习:缓存;为什么有时候出现问题要清除浏览器缓存?客户端缓存和服务端缓存是什么。
目录:
- 问题的背景
- Http的缓存是什么
- 客户端设置缓存,需要服务端允许?
- 缓存分类:为什么会有客户端缓存和服务器端缓存?
- 客户端缓存的参数设置,举例代码实现缓存
一、问题的背景
有时候网站出现问题,或者数据没有改变,通常客服或者售后会让我们刷新一下网页,或者关掉浏览器,或者清掉缓存再试试,然后就可以了,这是为什么呢?
今天我们就来看看http缓存是怎么样的。
二、Http的缓存是什么
HTTP缓存的主要目的是为了提高网页的加载速度和减少服务器的负载。当用户首次访问一个网页时,浏览器会下载网页上的所有资源(如HTML、CSS、JavaScript、图像等)。如果这些资源被缓存在本地,那么当用户再次访问该网页时,浏览器就可以直接从缓存中加载这些资源,而无需再次从服务器下载。这样可以显著减少加载时间,提高用户体验。
三、客户端设置缓存,需要服务端允许?
服务端是否设置这些头部字段并不影响客户端本身具有缓存功能的能力。即使服务端没有设置任何缓存相关的头部字段,客户端仍然可以缓存资源(尽管这种缓存可能是基于默认策略或客户端自定义策略的)。但是,为了确保客户端能够按照预期的缓存策略进行缓存,并避免潜在的缓存一致性问题,建议服务端明确设置这些头部字段。
四、缓存分类:为什么会有客户端缓存和服务器端缓存?
4.1 服务器端缓存
服务器端缓存是指将经常访问的数据或资源存储在服务器或服务器的边缘位置(如CDN节点),以便在后续请求中快速响应。
好处:
■ 减轻服务器压力:通过缓存常用响应来减少对源服务器的直接请求。
■ 内容分发:在跨地域的内容分发中,使用CDN缓存可以使用户更快地接收到数据。
■ 高流量网站:对于用户量大的网站,服务器缓存可以显著减少对源站的请求压力。
4.2 客户端缓存
客户端缓存是指将网页资源存储在用户的设备上(如浏览器),以便在后续访问时能够快速加载。
好处:
■ 减少网络流量:由于资源可以直接从本地获取,减少了数据从服务器到客户端的传输。
■ 加快请求速度:使用浏览器缓存可以避免网络延迟,提高页面加载速度。
■ 离线浏览:即使在网络不稳定或无网络时,用户仍然可以访问已经缓存的网页内容。
所以, 服务器端缓存的目的是减轻服务器压力、提高内容分发速度和减少高流量网站的请求压力,而客户端缓存则是为了加快页面加载速度、减少网络流量和支持离线浏览。
五、客户端缓存的参数设置,举例代码实现缓存
5.1 在HTTP客户端中添加缓存通常涉及以下参数:
- Cache-Control:
○ max-age:指定资源在客户端缓存的最大有效时间(秒)。例如,Cache-Control: max-age=3600表示资源在客户端缓存1小时。
○ public:资源可以被任何缓存存储(如浏览器、代理服务器)。
○ private:资源仅能被客户端缓存。
○ no-cache:需要重新验证资源有效性。
○ no-store:禁止缓存。 - Expires:表示资源的过期时间,是一个绝对时间。例如,Expires: Wed, 21 Oct 2023 07:28:00 GMT。需要注意的是,如果同时存在Cache-Control和Expires字段,Cache-Control的优先级更高。
- ETag:服务器返回的资源的唯一标识。客户端在后续请求中可以携带此标识(通过If-None-Match请求头),以便服务器验证资源是否发生变化。
- Last-Modified:标识响应资源的最后修改时间。客户端在后续请求中可以携带此时间(通过If-Modified-Since请求头),以便服务器验证资源是否已更新。
5.2 举例代码实现缓存
接下来做个例子, 我们在Android应用中使用Retrofit添加HTTP缓存时,你可以通过配置OkHttp客户端来实现。 比如我们要查询订单数据。
- 创建缓存目录和缓存实例
在Android应用中,指定一个目录来存储缓存文件。通常,这个目录可以是应用的内部缓存目录。
File httpCacheDirectory = new File(getApplicationContext().getCacheDir(), "http-cache");
int cacheSize = 10 * 1024 * 1024; // 10 MB
Cache cache = new Cache(httpCacheDirectory, cacheSize);
- 配置OkHttp客户端
创建一个OkHttp客户端实例,并配置缓存和拦截器来处理HTTP头部。
OkHttpClient client = new OkHttpClient.Builder().cache(cache).addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {// 添加自定义的Cache-Control头部,设置缓存时间为5分钟Request request = chain.request().newBuilder().header("Cache-Control", "public, max-age=300") // 5 minutes in seconds.build();Response response = chain.proceed(request);// 你可以在这里添加额外的逻辑来处理响应,比如根据ETag或Last-Modified验证缓存// 示例:如果服务器返回了304 Not Modified,你可以从缓存中获取数据(这通常是由OkHttp自动处理的)// 但如果你想手动处理,可以检查response.code()是否为304,并从缓存中检索原始响应return response;}}).build();
- 创建Retrofit实例
使用配置好的OkHttp客户端来创建Retrofit实例。
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://your.api.endpoint/").client(client).build();
4. 定义API接口
定义你的API接口,就像平常一样。
public interface ApiService {@GET("your/endpoint")Call<YourResponseModel> getYourData();}
- 使用Retrofit进行网络请求
现在,你可以使用Retrofit进行网络请求,并且请求的结果会根据你设置的缓存策略(以及服务器响应中的缓存头部)进行缓存。
ApiService apiService = retrofit.create(ApiService.class);
Call<YourResponseModel> call = apiService.getYourData();call.enqueue(new Callback<YourResponseModel>() {@Overridepublic void onResponse(Call<YourResponseModel> call, Response<YourResponseModel> response) {if (response.isSuccessful()) {// Handle the response dataYourResponseModel data = response.body();// ...} else {// Handle the error}}@Overridepublic void onFailure(Call<YourResponseModel> call, Throwable t) {// Handle the failure}
});
通过上述步骤,你可以在Android应用中使用Retrofit和OkHttp实现HTTP缓存。这样,当网络请求的数据在缓存有效期内时,客户端将直接从缓存中读取数据,而不是每次都向服务器发送请求。这可以显著提高应用的性能和用户体验。同时,服务端也应该设置适当的HTTP头部来配合客户端的缓存策略。
回到我们最开始的问题,为什么有时候遇到问题需要清除缓存呢?有时候是因为数据错误了,或者是旧的了,然后服务器进行了处理,如果我们想要获得最新的数据,那么就需要清除缓存,获取新的数据。
好了,内容就介绍到这里,我是前期后期,如果大家有内容想要讨论,可以在评论区分享,我们下一篇文章见。
相关文章:
HTTP 网络技术学习:缓存;为什么有时候出现问题要清除浏览器缓存?客户端缓存和服务端缓存是什么。
目录: 问题的背景Http的缓存是什么客户端设置缓存,需要服务端允许?缓存分类:为什么会有客户端缓存和服务器端缓存?客户端缓存的参数设置,举例代码实现缓存 一、问题的背景 有时候网站出现问题࿰…...
极限科技三周年庆典:追求极致,共创未来科技新篇章
2024 年 12 月 3 日,一场盛大的庆典活动在香港 IFS 集团旗下长沙玛珂酒店璀璨启幕,极限科技迎来了其三周年的辉煌庆典。此次庆典不仅是对极限科技过往成就的回顾与庆祝,更是对未来科技梦想的展望并开始新的启航。 庆典现场,极限科…...
利用PHP和GD库实现图片拼接的方法
利用PHP和GD库实现图片拼接的方法主要涉及到加载图片资源、创建目标画布、将图片资源绘制到目标画布上,并最终输出或保存拼接后的图片。以下是实现图片拼接的基本步骤: 加载图片资源: 使用imagecreatefromjpeg()、imagecreatefrompng()或ima…...
SpringBoot自动配置底层核心源码
SpringBoot底层核心源码 一、工程创建二、进一步改造三、自动配置 探究SpringBoot的自动配置原理,我们可以自己写一个启动类的注解。 一、工程创建 首先创建一个工程,工程目录如下: 自定义一个启动函数: package org.springboo…...
故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)
故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab) 目录 故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)分类效果基本描述程序设计参考资料 分类效果 基本描述 格拉姆角场差(GADF&#…...
【VUE小型网站开发】优化通用配置 二
1. 引入 MyBatis Plus 1.1 添加依赖 <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- My…...
基于阻塞队列的生产者消费者模型动画演示
一个基于阻塞队列的生产者消费者模型的动画演示: 这是打包好的程序。程序是用 QT 写的。 通过网盘分享的文件:CP模型.7z 链接: https://pan.baidu.com/s/1YjC7YiSqHGqdr6bbffaDWg?pwde6g5 提取码: e6g5 CP模型...
springSecurity认证流程
Spring Security 是spring家族中的一个安全管理框架。相比于另一个安全框架Shiro,它提供更丰富的功能和社区资源,但也较难上手。所以一般大项目用spring Security,小项目用Shiro。 一般web应用需要认证和授权,这也是spring Secur…...
vite5+vue3+Ts5 开源图片预览器上线
images-viewer-vue3:一款Vue3的轻量级图像查看器,它基于Flip动画技术,支持PC和h5移动网页预览照片,如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …...
Qt开发:元对象系统的介绍和使用
文章目录 概述元对象系统的概念和组成QObject 的详细介绍1.QObject 的主要特性信号与槽机制动态属性对象树(Object Trees)事件处理 2.QMetaObject的主要特性函数签名常用功能 概述 Qt本身并不是一种编程语言,它实质上是一个跨平台的C开发类库…...
.vscode文件中各个脚本需要修改的地方
NOTE: 此篇文章由VSCode编辑GCC for ARM交叉编译工具链Makefile构建OpenOCD调试(基于STM32的标准库)派生而来,对.vscode文件中各个脚本需要修改的地方作补充说明。 tasks.json 该json文件的主要作用:使用XX名称去执行…...
JavaScript模块化规范
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
第二篇:k8s工作流程
我们来看通过deployment部署pod的常规流程: kubectl向apiserver发送部署请求(例如使用 kubectl create -f deployment.yml)apiserver将 Deployment 持久化到etcd;etcd与apiserver进行一次http通信。controller manager通过watch a…...
什么是数据架构?
数据架构是如何使用数据的蓝图--它是数据和数据相关资源的高层结构,是整个组织的数据框架,包括模型、规则和标准。通过高效的数据架构,企业可以跟踪整个 IT 基础设施中数据的获取、移动、存储、安全性和可访问性。 数据架构总览 数据架构是…...
ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算——从0基础到15个案例实战
在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而,对于许多专业人士而言,如何高效地处…...
微信小程序权限授权工具类
最近写微信小程序的时候需要在页面获取设备权限,又不想每个页面都写,就写了一个工具类方便管理 /*** 权限工具类用于获取授权* 权限工具类使用方法,注意调用时函数需要定义为异步函数 async* import PermissionUtils from "./permissio…...
CT中的2D、MPR、VR渲染、高级临床功能
CT中的2D、MPR、VR渲染 在CT(计算机断层扫描)中,2D、MPR(多平面重建)、VR(体积渲染)是不同的图像显示和处理技术,它们各自有独特的用途和优势。下面分别介绍这三种技术:…...
【MySQL】Windows下重启MySQL服务时,报错:服务名无效
1、问题描述 在终端中,停止、启动MySQL服务时报错:服务名无效 2、原因分析 1)权限不够 如果是权限不够,会提示:系统错误5,拒绝访问。 2)服务名错误 如果是服务名错误,会提示“…...
java枚举的基本用法
在 Java 中,枚举(enum)是一种特殊的类,用于定义一组常量。它可以使代码更具可读性和可维护性。枚举类型可以用于表示固定的、有限的值集合,比如星期几、季节、方向等。 以下是一些常见的枚举用法示例: 1.…...
Web网络安全
一. 浏览器系统安全方面,使用多进程方案,而js主线程运行在渲染进程中,渲染进程时运行在沙箱中的,没有对本地OS文件的直接读写权限,所以需要通过IPC与浏览器主线程通信,才可以获取cookie等信息,这…...
【分子材料发现】——GAP:催化过程中吸附构型的多模态语言和图学习(数据集处理详解)(二)
Multimodal Language and Graph Learning of Adsorption Configuration in Catalysis https://arxiv.org/abs/2401.07408Paper Data: https://doi.org/10.6084/m9.figshare.27208356.v2 1 Dataset CatBERTa训练的文本字符串输入来源于Open Catalyst 2020 (OC20…...
matlab Delaunay三角剖分提取平面点云的边界
目录 一、算法原理1、算法概述2、参考文献二、代码实现三、结果展示四、详细过程版一、算法原理 1、算法概述 Delaunay三角网在生成三角网过程中,以最近的三点形成三角形,且各三角形的边皆不相交,每条边都使用所在的三角形的顶点验算并记录相应的2个顶点坐标。整个验算过程…...
Spring07——AOP通知以及几个相关案例
切入点表达式 注意,不是参数,是参数类型 可以使用通配符描述切入点,快速描述 ■ *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的通配符出现 execution(public∗com.itheima.∗.UserServi…...
【AI工具】强大的AI编辑器Cursor详细使用教程
目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日,由四名麻省理工学院(MIT)本科生共同创立的Anysphere公司宣布,其开发的AI代码编辑器Cursor在成立短短两年…...
CV工程师专用键盘开源项目硬件分析
1、前言 作为一个电子发烧友,你是否有遇到过这样的问题呢。当我们去查看函数定义的时候,需要敲击鼠标右键之后选择go to definition。更高级一些,我们使用键盘的快捷键来查看定义,这时候可以想象一下,你左手按下ALT&a…...
STM32标准固件库官网下载方法
Keil标准固件库官网下载方法 Keil中DFP.pack下载方法 打开keil官网 Keil 官网 www.keil.com 点击产品 点击“Products” 点击 “Arm Cortex-M” 下拉找到CMSIS-Packs 点击CMSIS-Pack index 搜索对应的MCU,我这里是STM32F4 注意搜索对应系列就好 点击下载...
数据库原理实验实验四 统计查询和组合查询
实验目的和要求加深对统计查询的理解,熟练使用聚簇函数。 实验环境SQL SERVER 2008 SQL Server Management Studio 20 实验内容与过程题目一: 学生(学号,年龄,性别,系名) 课程(课号,课名,学分,学时) 选课(学号,课号,成绩) 根据上面基本表的信息完成下列查…...
【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向
【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…...
【Linux从青铜到王者】数据链路层(mac,arp)以及ip分片
局域网通信 通过之前的学习,我们了解了应用层,传输层,网络层的协议和作用,这里先做个总结 应用层——http,https协议,也可以自己定义一套,作用是进行数据的处理传输层——tcp,udp协…...
MyBatis注解开发
1.配置MyBatis_ssm配置mybits-CSDN博客 2.Mybaits实现增删改查-CSDN博客 3.MyBatis构建动态SQL-CSDN博客 目录 一、注解开发的定义 二、SQL常用注解 三、使用注解完成CRUD 1.查找所有 2.通过id查询 3.增加 4.更新 5.删除 6.查询数量 7.模糊查询 一、注解开发的定义 …...
Unity引擎UI滚动列表——滚动复用扩展应用
大家好,我是阿赵。 之前介绍了滚动复用的基础用法。上一个例子里面,是一个竖向单列的滚动列表展示。这一次来扩展一下用法。如果不知道上一次例子的,可以先往前翻一下,上面有例子的详情、原理解释和代码。 一、 多列的滚动复…...
MySQL 死锁排查
私人博客传送门 MySQL 死锁排查...
AI - 浅聊一下基于LangChain的AI Agent
AI - 浅聊一下基于LangChain的AI Agent 大家好,今天我们来聊聊一个很有意思的主题: AI Agent ,就是目前非常流行的所谓的AI智能体。AI的发展日新月异,都2024年末了,如果此时小伙伴们对这个非常火的概念还不清楚的话&a…...
校园综合服务小程序+ssm
摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园综合服务被用户普遍使用,为方便用户能够可…...
RPC设计--TcpConnection和TcpServer
TcpConnection 对于服务端来说用来封装clientfd,对于client端来说,就是封装connect函数返回后的fd. 处理此fd上的读写,因此需要为其提供read\write方法,其方法内部调用系统的read\write函数,从fd中读写数据。 当Fd上…...
Mysql 的 B+ 树是否包含行数据?
在 MySQL 中,是否在 B树 的叶子节点上存储完整的行数据,取决于使用的 存储引擎 和 索引类型: 聚簇索引 (Clustered Index) 叶子节点包含完整的行数据。 适用场景:MySQL InnoDB 存储引擎的主键索引(或聚簇索引…...
CSS系列(2)-- 盒模型精解
前端技术探索系列:CSS 盒模型精解 📦 致读者:深入理解盒模型的本质 👋 前端开发者们, 今天我们将深入探讨 CSS 盒模型,这是构建网页布局的核心概念。通过本文,你将全面理解盒模型的工作原理及…...
Matlab在信号处理领域有哪些典型的设计实例?
以下是Matlab在信号处理领域的一些典型设计实例: 一、信号生成与频谱分析 正弦信号生成与频谱分析 - 题目:生成一个频率为 f 10 H z f 10Hz f10Hz,采样频率为 f s 100 H z f_s100Hz fs100Hz,时长为 T 5 s T 5s T5s的正弦…...
frida(objection)中x.ts到x.py封装路径
objection run "android hooking list classes" 基于sensepost/objection.git/1.11.0 sensepost/objection.git/e7eb1 简版路径: android hooking list classes --> show_android_classes --> android_hooking_get_classes androidHookingGetClasses --&g…...
python学习笔记—1—基础环境配置和字面量
1. 字面量 在代码中被写下来的固定值称为字面量 (1)整数字面量 666 (2)浮点字面量 6.66 (3)字符串字面量 "supercarrydoinb" 2. python中的数据类型 3. 打印字面量 print("666") …...
【Windows11系统局域网共享文件数据】
【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…...
包管理器npm, cnpm, yarn 和 pnpm 的命令
npm (Node Package Manager) 安装与更新 npm install 或 npm i: 安装项目依赖:根据 package.json 文件安装所有列出的依赖。参数: -S, --save:保存到 dependencies(默认行为)。-D, --save-dev:…...
MATLAB 最小二乘平面拟合(90)
MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…...
kubesphere服务报错 页面无法登陆
kubesphere的页面无法访问 查看pod服务,发现ks-apiserver的pod一直在重启 在所在node节点,执行dmesg -T 发现内存溢出 修改deploy的memory的配置 原本的request memory的值为100M 调整为2G 修改之后,服务正常启动,页面访问正常…...
filezilla连接不上虚拟机的解决方案
现象 解决过程 虚拟机终端输入ip addr 输出: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever p…...
番茄钟与Todo List:用Go构建高效的时间管理工具
引言 在当今快节奏的世界中,时间管理和任务组织变得越来越重要。为了帮助用户提高效率,我开发了一个基于Golang的开源项目,基于fyne的ui,它结合了经典的番茄工作法(Pomodoro Technique)和功能丰富的待办事…...
vim实用命令整理(常用的命令)
本章教程,总结自己平时使用vim过程中,经常使用的命令,分享给大家。 一、高频使用 i:进入插入模式(光标处插入) a:进入插入模式(光标后插入) esc:返回普通模式 ::进入命令模式 :w:保存 :q:退出 :wq:保存并退出 :q!:强制退出不保存 :e filename:打开文件 :set n…...
METAGPT
METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK MetaGPT:面向多代理协作框架的元编程 1. 引言 近年来,基于大型语言模型(LLMs)的多智能体系统在自动问题解决方面取得了显著进展。然而,现有的…...
LabVIEW调用Thorlabs的动态库进行开发
Thorlabs 产品在科研与生产领域中的应用广泛,当需要基于LabVIEW 进行二次开发时,可按照以下方法操作,以充分发挥设备性能并满足特定的项目需求。 创建 Kinesis LabVIEW 项目文件和文件夹 更详细的说明参见附件 在 LabVIEW 的启动界面中选择…...
Lua使用点号和冒号的区别
首先建立一个table,再分别定义两个方法,如下: local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…...