让开发又爱又恨的缓存
说起缓存可谓是让程序员爱恨交加!我结合项目经验谈谈自己的一些见解。
在我们更新完已上线的项目后,用户浏览器显示的确实旧版的页面,没有及时获取到我们更新的资源,此时用户刷新一下页面,就得到了更新后的资源,又是为什么呢?
答案就是浏览器缓存
浏览器缓存是前端优化的一个重要问题,缓存可以带来很多好处:
(1)减少冗余的数据传输,节省宽带;
(2)减轻服务器的请求负担,有缓存就可以少向服务器发送请求,尤其是对于一些访问量很大的网站
(3)资源从缓存中读取,无需向服务器发送请求再等待返回,加快了客户端访问速度
但是缓存也同样给前端带来了一个很严重的问题,就是上面所说的项目更新的问题。如果项目更新了,用户浏览器读取的是缓存资源,虽说刷新或者清除浏览器缓存可以获取最新的页面,但是做开发常说的一句话叫做:要把用户当傻瓜一样对待,能少一步绝不多一步(冒犯了冒犯了,立马道歉)
浏览器缓存主要指http缓存,其机制是根据http报文的缓存标识进行相应操作。
浏览器有三级缓存原理
1.先查找内存,如果内存中存在,从内存中加载;
2.如果内存中未查找到,选择从硬盘获取,如果硬盘有,从硬盘加载;
3.如果硬盘中未查找到,那就进行网络请求,加载到的资源缓存到硬盘和内存;
如上常见情况就是我们打开控制台的Network发现资源加载情况是200 from disk cache,这很明显浏览器没有请求新的资源,那么有没有办法去解决这种情况?
浏览器缓存(强制缓存和、协商缓存也叫对比缓存)
1.强制缓存
见字明意,强制缓存就是用户第一次访问页面之后,浏览器将数据存在缓存之中,在过期时间之内,都不会请求服务器,是否使用强制缓存存在于资源是否过期,该过期时间从第一次请求服务器响应头中获取,如果在过期时间内,从缓存中读取,如果超出过期时间,则使用协商缓存
控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。
2.协商缓存
从字面上意思主在协商,在第一次请求服务器时,服务器会返回一个资源的缓存标识,一起存到浏览器的缓存数据库,第二次请求资源时,浏览器会首先将缓存标识发送给服务器,服务器处理标识是否匹配,如果不匹配表示资源有更新,服务器会将新数据和缓存标识一起返回浏览器;如果匹配,表示资源没有更新并且返回304状态码,浏览器读取本地缓存服务器中的数据
与协商缓存相关的字段是 Last-Modified/If-Modified-Since、Etag/IF-None-Match
Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304
缓存类型 | 获取资源形式 | 状态码 | 发送请求到服务器 |
---|---|---|---|
强缓存 | 从缓存取 | 200(from cache) | 否,直接从缓存取 |
协商缓存 | 从缓存取 | 304(Not Modified) | 否,通过服务器来告知缓存是否可用 |
用户操作 | Expires/Cache-Control | Last-Modied/Etag | |
---|---|---|---|
地址栏回车 | 有效 | 有效 | |
页面链接跳转 | 有效 | 有效 | |
新开窗口 | 有效 | 有效 | |
前进回退 | 有效 | 有效 | |
F5刷新 | 无效 | 有效 | |
Ctrl+F5强制刷新 | 无效 | 无效 |
如文章开头所属,代码更新到线上后用户浏览器不能自行更新,我们不能要求客户在系统更新后都进行一次缓存清理的操作。 到底该如何解决呢? 在资源请求的URL中增加一个参数,比如:js/mian.js?ver=0.7.1。这个参数是一个版本号,每一次部署的时候变更一下,当这个参数变化的时候,强缓存都会失效并重新加载
让开发又爱又恨的缓存相关推荐
- 让你又爱又恨的推荐系统--程序猿篇
正文共8957个字,13张图,预计阅读时间23分钟. 又爱又恨的推荐系统 作为一名程序猿,一直对推荐系统比较感兴趣,最近看到一个用户的吐槽: 又爱又恨 推荐系统的应用场景,我相信在日常生活中大家基本都 ...
- 专访傲游CEO陈明杰:为何微软对IE8“又爱又恨”
随着IE 8 Beta 2和Google Chrome的推出,浏览器战场注定会变得更加硝烟弥漫,就连世界著名前端大师.JSON的创立者Douglas Crockford也忍不住在本月的一次技术论坛上高 ...
- 谈谈Nancy中让人又爱又恨的Diagnostics【上篇】
前言 在Nancy中有个十分不错的功能-Diagnostics,可以说这个功能让人又爱又恨. 或许我们都做过下面这样的一些尝试: 记录某一个功能用到的相关技术信息 记录下网站的访问记录 全局配置某些框 ...
- 减持后大笔收购,汽车之家为何让中国平安又爱又恨?
减持后大笔收购,汽车之家为何让中国平安又爱又恨? 公司上市后股东减持一部分股票本是常规操作,但刚减持一个月又大笔收购的实属少数. 近日中国平安就上演了这样一出"好戏". 资料显示: ...
- 又爱又恨的正则表示式
正则表达式 谈起到正则表达式,很多开发人员都会感觉到又爱又恨,爱的是什么呢?恨的又是什么呢?爱的是正则表达式确实在开发当中非常有用,可以处理很多棘手的问题, 恨的是正则表达式确实很难理解,又很难记忆, ...
- 让我又爱又恨的Java《打工人的那些事》
让我又爱又恨的Java<打工人的那些事> 概述 我从事Java行业,差不多有6年了. 对于Java,我是又爱又恨.那么,爱从何说起.恨又从何而谈. 下面我会一一道来. 始于ACM 2014 ...
- 终于离开了让我又爱又恨的外包圈,附赠外包圈趣事及混外包圈秘籍
从年本科毕业,我就一直在外包圈工作.直到前几天终于拿到了一份满意的offer,离开了这个让我又爱又恨的圈子. 说实话,对于外包的经历,我想我是个异类: 外包的工作我一直干的比较满意,甚至薪水也算满意, ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据 转载于:https://github.com/Meowv/Blog 在日志记录中使用的静态方法有人指出写法不 ...
- 《花落红尘》:对两性社会非爱即恨的文学消解
李素红是个我比较陌生的女作家,读了她的<花落红尘>(作家出版社2011年版),我非常惊讶.据说作者是搞书法的,且成绩斐然,还有自己的公司,她的写作几乎是在业余时间.由此我想到了" ...
最新文章
- github自己的仓库给别人上传代码的操作
- 基于redis的cas集群配置(转)
- python开发需要掌握哪些知识-学习Python应该掌握哪些知识点?
- Android SharedPreferences登录记住密码
- [LeetCode] Move Zeroes - 整数数组处理问题
- 今天,公司架构师跟我分享多年的私货 | 进阶之路必读书籍(附下载链接)
- odoo10参考系列--网络控制器(Web Controllers)
- MVVM 实战之计算器
- Redis数据结构及内部编码
- LaTeX插入图片时,图总是置顶的解决办法
- Windows错误恢复无限重启;开机后灯亮风扇转下停下
- osm 搭建离线地图_利用OpenStreetMap(OSM)数据搭建一个地图服务
- 网页计算机谈音乐,如何用windows电脑录制网页上或电脑中自己的音乐
- mysql压缩包安装设置密码
- 计算机专业Java毕设怎么做
- 自然语言处理学习笔记-lecture08-语义分析
- Android与GNU体系
- Docker自定义镜像上传阿里云
- 黑盒测试技术(Decision Tables 决策表法,又称判定表法)——软件质量保证与测试
- ascii unicode utf8 gkb之间的关系
热门文章
- WM_CTLCOLOR消息重载
- truetype字体怎么转换成普通字体_TrueType字体作用|如何在文档嵌入 TrueType 字体中...
- 博客上怎么根据搜索ID搜索其它人
- CAPI 初探及使用小结(1)
- 30句瞬间使你清醒的话,别再假装糊涂下去了!
- 树模型之三种常见的决策树:CART,…
- 【支线】输电杆塔识别-YOLO v5在Aidlux的部署
- html5+css3学习笔记(一)
- 主板声卡坏了会不会有电流声_不要小瞧十几块钱的USB声卡!
- 1.初始PR,怎么导入素材和添加效果处理?