一谈缓存,内心顿时豁然开朗。迫于key-value的形式,总感觉轻风扶面,杨柳依依,一切都尽在我掌握之中。犹如那一眼相中佳人的冲动,脑子里尽是佳人的容颜。
软件运行都需建立在操作系统之上,在运行时需要把程序装载到内存中,但软件执行操作内存时都是基于虚拟内存映射的机制,并不是直接操作物理内存。虚拟内存以块表(内存块组成的表格)的形式来存储相关资源。
注:物理内存组成上由多个方块状的元素构成,该元素是内存管理的最小单位。每一个元素有8个小电容,存储8个bit,即1字节。
是不是和磁盘块差不多, _ 。吒吒辉懂你呀
为提高系统的存取速度,在 地址映射机制中增加了一个小容量的联想寄存器,即块表。
日常开发常使缓存软件,根据软件系统所处位置不同,可分
- 客户端缓存
- 络缓存
- 服务端缓存
多级缓存就类似金字塔模式。从上到下依次递减。类似于一个漏斗来过滤流量请求。如果绝大多数请求在客户端和 络交互的部分就抵消,那后端服务的压力就会大大减少。
影响用户体验的因素
影响用户体验的三因素:
- 使用者的状态
- 系统性能
- 环境
系统性能是软件产品自身对用户体验最关键的因素。 因感受软件性能的主体是人,不同的人对于同样的软件可能有不同的主观感受,而且对于软件性能关心的视角也不同。
系统性能是一种非功能特性,它关注的不是某种特定的功能,而是在完成该功能时所展示出的及时性。
关于系统的性能
系统性能的指标一般包括 响应时间、延迟时间、吞吐量,并发用户数和资源利用率 等几方面。
响应时间
响应时间是指,与人对软件性能的主观感受是一致的,完整地记录了整个系统处理请求的时间。
一般响应时间根据不同项目中的业务场景都会有确切的值,例:一个请求需保证在100ms、200ms以内。
你家首页响应需多少时间/p>
由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下,响应时间也不相同。
所以,我们常说的响应时间通常指该软件系统 所有功能的平均响应时间 或者 所有功能中的最大响应时间。
有时候也需要对 每个或每组功能讨论其平均响应时间和最大响应时间。
在讨论软件性能时,我们更关心所开发软件自身的 “响应时间”。
比如:PHP响应时间就是从接受到nginx请求后,并完成业务处理然后响应给nginx所消耗的时间。而用户就看发送请求到看到页面所需的时间
前者是整个软件自身的响应,后者是用户请求响应的时间。观看角度不同
就这样,我们可以把 用户感受到的响应时间 划分为 呈现时间和系统响应时间,
- 呈现时间:客户端在接收到系统数据时呈现页面所需的时间,即页面渲染加载时间,
- B/S架构:页面缓存和浏览器缓存
- 移动应用:APP自身所使用的缓存
- 客户端将页面自身对某些元素或全部元素进行缓存。简称离线应用缓存
- 服务端将静态页面或动态页面的元素进行缓存,然后给客户端使用。简称页面自身缓存。
- 准备用于描述页面需要缓存的资源列表清单文件 。
- 在需要离线使用的页面中的 html 里添加 属性,指定缓存清单文件的路径。 离线缓存的工作流如图所示。
- 在服务器侧设置 Expires的HTTP头 来告诉客户端在重新请求文件之前缓存多久是有效的.
- 请求通过 if-modified-since 的条件判断使用缓存。
- Last-Modified:Last-Modified是响应头,web容器会把最后修改时间告诉客户端
- 两者一起使用时,Cache-Control/Expires的优先级要高于Last-Modified/ETag。
- 在下载完数据文件后,把文件的相关信息(如URL、路径、下载时间、过期时间等)存放到数据库.
- 等下次请求下载的时候,根据URL先从数据库中查询,如果查询到当前时间并未过期,就根据路径读取本地文件,实现缓存的效果。
- placeholderImage是 络图片在尚未加载成功时显示的图像
- SDWebImageOptions是相关选项。
- 磁盘缓存
- 内存缓存
- 缓存根据存在方式有系统、硬件、软件三类。
- 软件根据场景客户端、 络、分布式缓存
- 用户体验**:即用户在使用一个产品或系统之前、使用期间和使用之后的全部感受。
- 系统性能指标有响应时间、延迟时间、吞吐量,并发用户数和资源利用率等几方面
- 站架构演讲,经历起步、发展、中期、高手增长、后期
- 客户端缓存分为页面缓存、浏览器缓存、APP缓存
无并发的应用都是单机应用,对于互联 或者移动互联 上的产品而言。
并发用户数
并发用户数是指系统可以同时承载的正常使用系统功能的用户数量,值越大,那处理能力就越强。
资源利用率反映的是在一段时间内资源平均被占用的情况。
从浏览器—> 络—>应用服务器—>数据库,通过在各个层面应用缓存技术,将大幅提高提升整个系统的性能。
例如:缓存离客户端更近,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,系统就显得更灵敏。缓存数据的重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护。
所以,使用 缓存技术,可以降低系统的响应时间,减少 络传输时间和应用延迟时间,进而提高了系统的吞吐量,增加了系统的并发用户数
利用缓存还可以最小化系统的工作量,使用了缓存就可以不必反复从数据源中查找,缓存所创建或提供的同一条数据更好地利用了系统的资源。
发展
由于 站具备一定的特色,吸引了部分用户的访问,逐渐会发现系统的压力越来越大,响应速度越来越慢,而这个时候比较明显的往往是 数据库与应用 的互相影响,于是将应用服务器和数据库服务器从物理上分离开来,变成了两台机器。让其不在互相影响,来支撑更高的流量。
那我数据库写呢/p>
此刻流量上升,主要针对访问,写请求也会上升,但性能瓶颈在于数据库的读操作上。可以说写还构不成太大的威胁。如果写不够,那只能扩容多个实例来应对写的不足。
高速增长期
随着访问量的持续增加,系统又开始变慢,怎么办/p>
使用 数据缓存,将系统中重复获取的数据信息从数据库加载到本地,同时降低了数据库的负载。 随着系统访问量的再度增加,应用服务器又扛不住了,就开始增加Web服务器。
那如何保持应用服务器中数据缓存信息的同步呢/p>
例如: 之前缓存的用户数据等,这个时候通常会开始使用缓存同步机制以及共享文件系统或共享存储等。 在享受了一段时间的访问量高速增长后,系统再次变慢。
纵观 站架构的发展历程,缓存技术往往就是解除烦恼的灵丹妙药,这再次证明了什么是缓存为王。
客户端缓存的实施方案
客户端缓存相对于其他端的缓存而言,要简单一些,通常是和服务端以及 络侧的应用或缓存配合使用。
在互联 应用中,根据应用区分有二大类。
页面缓存
页面缓存是什么br> 页面缓存有两层含义:
页面缓存是将之前渲染的页面保存为静态文件,当用户再次访问时可以避开 络连接,从而减少负载,提升性能和用户体验。
随着单页面应用(Single Page Application,SPA)的广泛使用,加之HTML5支持了离线缓存和本地存储,大部分BS应用的页面缓存都可以举重若轻了。
在HTML5中使用本地缓存的方法,示例代码如下:
什么是单页面应用/p>
SPA是在 Web 设计上使用单一页面,利用 JavaScript 操作 Dom 的技术实现各种应用。此模式下一个系统只加载一次资源,之后的操作交互、数据交互是通过路由、ajax来进行,页面并没有刷新。
常见的路由形式如:http:.//xxx/shell.htm1#page1。
一般在Vue下使用很明显。像商城活动页、登录页这种都是很好的SPA落地实践。
HTML5提供的离线应用缓存机制,使得 页应用可以离线使用(无 络也可访问),这种机制在浏览器上支持度非常广,可以放心地使用该特性来加速页面的访问。开启离线缓存的步骤如下:
注:manifest 文件需要配置正确的 MIME-type,即 “text/cache-manifest”。必须在 web 服务器上进行配置。
例:nginx要修改配置目录下的 mime.types 文件,添加manifest文件映射:
浏览器缓存
浏览器缓存是根据一套与服务器约定的规则进行工作的,工作规则很简单:检查以确保副本为最新,通常只要一次会话请求。
浏览器会在硬盘上专门开辟一个空间来存储资源副本作为缓存。
在用户触发 后退操作或点击 一个之前看过链接的时候,浏览器缓存会很管用。如果访问系统中的同一张图片,该图片可以从浏览器缓存中调出并几乎立即显现出来。
HTTP1.0
对浏览器而言,HTTP1.0提供了一些很基本的缓存特性,参数例如:
每次请求web容器时会先检查客户端缓存资源是否还有效,无效则会把上次服务端响应的最后修改时间作为 If-Modified-Since 的值发送给服务器进行判断,如果文件没有改变,服务器采用 **304-Not Modified做响应头和一个为空的响应体。**客户端收到304响应,就可以使用缓存的文件版本了。
为什么客户端无效,还要发送HTTP请求来判断文件是否修改呢/p>
如果缓存资源有效那确实直接来读取客户端缓存,不需要发送HTTP请求。但有一些情况就需注意,比如当用户按F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以就需要通过Last-Modified来判断。
而且客户端和服务端的时间可能不一样,这样就会导致客户端已过期,但服务端并没有。如果有判断机制,那么响应就会减少响应体的数据发送。 或者客户端只是单纯的 Expires 过期,但资源并没改变,这时就需要检查文件是否有变化。
在配置了 Last-Modified/ETag 的情况下,浏览器再次访问统一URI的资源时,还是会发送请求到服务器询问文件是否已经修改,如果没有,服务器会生成304-Not Modified应答和一个空的响应体给浏览器,浏览器则直接从本地缓存取数据;如果数据有变化,就将整个数据重新发给浏览器。
汇总
Last-Modified/ETag 与 Cache-Control/Expires的作用是不一样的。前者是每次询问实体版本是否有变化,后者是直接检查本地的缓存还在有效的时间范围内,如果在就不会发送任何请求。
当本地副本根据 Cache-Control/Expires 判断是否还在有效期内,如果不在,则会再次发送请求去服务器询问修改时间(Last-Modified)或实体标识(e-tag)。
Cache-Control与Expires的功能一致,都是指当前资源的有效期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。
APP端缓存
尽管混合编程(hybrid programming)已成为时尚,吵在尖端,但移动互联 目前还是原生应用(APP)的天下。无论大小型APP,灵活的缓存不仅大大减轻了服务器的压力,而且会因更快速的用户体验而方便用户。 如何把APP 缓存对于业务组件透明,以及APP缓存数据的及时更新,是APP缓存能否成功应用起来的关键。
组件透明是什么/p>
即组件对调用者来说没有什么影响,也不需要维护。开箱即用。
APP缓存可使用那些缓存/p>
APP可以将内容缓存在 内存、文件或本地数据库(例如SQLite)中,但基于 内存的缓存 要谨慎使用。
本地库操作
APP使用数据库缓存的方法:
优点:方法具有灵活存放文件的属性,进而提供了很大的扩展性,可以为其他的功能提供良好的支持。
缺点:信息存储过多,存储容量会降低。所以要根据业务选择合适主要的信息存储
注意数据库缓存的清理机制 。
SDWebImage 是个比较大的类库,提供一个UIImageView的类以支持远程加载来自 络的图片,具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。使用时,只需要在头文件中引入
即可调用异步加载图片方法:
URL是图片的地址
默认情况下,SDWebImage会忽略Header中的缓存设置,将图片以URL为key进行保存,URL与图片是一一映射关系。在APP请求同一个URL时,SDWebImage会从缓存中取得图片。将第三个参数设置为SDWebImageRefreshCached就可以实现图片更新操作,例如:
SDWebImage中有两种缓存
框架都提供了相应的清理方法:
要注意的是,在iOS7中,缓存机制做了修改,使用上述两个方法只清除了SDWebImage的缓存,没有清除系统的缓存,所以可以在清除缓存的代理中添加以下代码:
最后:
如果大家在阅读过程中,发现了不理解或有错误的地方,欢迎跟在底部留言,你们的每一条留言,吒吒辉都会回复。
如有帮助, 、分享+收藏额,微信搜索【莲花童子哪吒】
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8582 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!