首页 > 其他分享 >[系统设计] 计算机系统设计思想:缓存/局部性原理(转载)【待完善】

[系统设计] 计算机系统设计思想:缓存/局部性原理(转载)【待完善】

时间:2023-08-07 18:37:19浏览次数:46  
标签:缓存 网站 CDN 用户 服务器 设计 局部性 加载

1 缓存概述

缓存思想是计算机系统设计中极为重要的解决手段,其本质原则是————局部性原理

在资源有限的情况下,将热点资源、最重要的资源部署到离请求方最近的地方去,以达到性能预期。

1.1 什么是缓存,为什么要用缓存?

缓存就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。

当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。

缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。

1.2 有哪些种类的缓存,并分别描述一下它们的应用场景?

文件缓存:文件缓存是把一些需要高速存取的变量缓存在内存中。模板引擎用的就是文件缓存机制,把动态代码编译成静态文件放入硬盘,不用每次访问都编译,直接读出即可。

浏览器缓存:浏览器缓存根据一套与服务器约定的规则进行工作,在同一个会话过程中会检查一次并确定缓存的副本足够新。如果在浏览过程中前进或后退时访问到同一个图片,这些图片可以从浏览器缓存中调出而即时显示。

数据库缓存:常用的缓存方案有memcached、redis等。把经常需要从数据库查询的数据、或经常更新的数据放入到缓存中,这样下次查询时,直接从缓存直接返回,减轻数据库压力,提升数据库性能。

Web应用层缓存:应用层缓存指的是从代码层面上,通过代码逻辑和缓存策略,实现对数据、页面、图片等资源的缓存,可以根据实际情况选择将数据存在文件系统或者内存中,减少数据库查询或者读写瓶颈,提高响应效率。

服务器缓存:包括代理服务器缓存CDN缓存
代理服务器缓存:代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。
代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少响应时间和带宽使用方面很有效,同一个副本会被重用多次。
CDN缓存:也叫网关缓存、反向代理缓存。CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。
浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。
虽然这种架构负载均衡源服务器之间的缓存没法共享,但却拥有更好的处扩展性。从浏览器角度来看,整个CDN就是一个源服务器。

2 经典缓存解决方案

2.1 CDN缓存/CDN加速

2.1.1 CDN的定义与原理

CDN通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

CDN最大的特色在于加速。
那么,CDN是如何实现各种“加速”,发挥“加速”功用呢?
如下图所示,CDN有很多节点,通过域名实现就近接入。
当用户发起一个请求后,CDN会回源取,然后把文件就近缓存在那个节点的服务器上。
假设北京的用户到北京节点只需4毫秒,后面写了一个90%的请求其实都直接命中到了服务器,那么还有10%的流量回到了二级cache节点。
而二级cache节点也是同样的缓存服务器,假设它的命中率也是90%,那么最终只有1%的流量到源站。
如果纯粹回到源站可能需88毫秒,而通过访问CDN就会大大缩短时间,甚至4毫秒就可以让用户拿到一个文件。
这是CDN实现加速的基本原理。

2.1.2 CDN一般放些什么东西?

一般放静态资源,如视频、音频等不会轻易改动的资源。
这是网站优化的一种手段,网站优化,缓存为王。

CDN支持许多种服务,最常用的服务有:

  • 下载:通常是一些终端用户,如网游用户、软件用户、程序开发员及要下载大量文件的用户会使用到。通过使用CDN,人们便无需使用高带宽连接到昂贵的数据中心,并且通过CDN节点,这些文件会放到离终端用户更近的地方。

  • 静态文件/图片:CDN最常用的用途是用来给终端用户发布静态文件,如图片、java脚本、css文件等。通常这些类型的文件很少变更,即便有变更,也是少量的,所以,把文件发布并存放到离终端用户比较近的地方会极大地提高网站速度,在地理位置分散或连接性能很差的地方,网站速度提高会显得更加明显。

注意:该服务仅仅用于处理静态文件,如主要的网站页面,所有动态内容,都是由主网站服务器提供。这通常是分开处理的,通过不同的子域名进行处理,如images.mydomain.com,与www是分开的。

  • WSA:即整体网站加速。用来加速整个网站,包括所有的静态的东西及动态的东西,如网页、购物车及推荐信息等。终端用户只连接到CDN,CDN连接到网站,然后缓存所有的东西,CDN代表用户向实体的网站后台发送请求,获取动态数据。CDN只能改善一部分内容的访问速度,因为其它的内容,如采购历史、产品库存等必须直接从后台网站获得。对于连接性很差的网络,如移动网络以及复杂的、难以将静态内容从静态CDN分离出来的网站来说,WSA尤为好用。

注意:为确保WSA成功,谨慎的配置及缓存控制头信息是非常重要的,因为CDN需要知道要缓存哪些东西,以及哪些东西是要传递到后台的。
  

  • 流媒体内容:媒体类网站使用越来越多的流媒体内容,如视频,包括来自于其它网站(如Youtube、Youku等)的实际的电视节目、影片等。CDN为这些内容提供特别的下载服务,通常称之为点播Vod,可以处理并控制所有视频,包括快进/后退视频,可以访问经过授权的内容,提供各种跟踪服务等。对于这些服务而言,视频通常是加载到CDN,并且通过特定的URL直接提供视频。此外,一些CDN还提供现场流体内容,如,体育或其它事件等实时播放,进行现场内容直播

  • 安全服务:例如,许多CDN可提供防DDoS攻击服务,由于它们比任何一个网站的带宽都大,而且分散,所以能够经受住此类攻击。此外,一些专门的CDN,如CloudFlare 及 AnQuanBao 也提供像防火墙一样的应用程序,如防止SQL注入攻击、XSS攻击及其它防攻击手段以保护后台站点。

  • “内容感知”网络服务:这是一种新型服务,是通过CDN系统更智能化管理的内容,可以给不同用户,如移动或DSL或办公室用户等提供不同的优化过的内容。它可以对内容进行处理,以便提供给不同设备,也可以对内容进行优化,以便将最重要的内容优先下载下来,使用户获得最佳体验。它们还会判断在哪个地方存放哪些内容,总之,该系统能够使网站在复杂的互联网环境下有良好的性能表现。

  • 全球服务:有些CDN还提供全球服务,帮助客户开拓新区域或国际区域,如中国、拉美或国外其它地区。对于全球品牌而言,这种服务非常重要,对于想要获得国际客户的中国公司而言,这种服务也非常重要。这种全球或局部CDN帮助人们在无需数据中心特别带宽等情形下,便可获得庞大的用户群。

  • 其它:CDN有许多其它功能及服务,以满足特殊需求,如电商、预加载、网游、动态加速、安全及DRM控制等。此外,还提供特殊的满足地理要求或网络要求(如中国移动或CERNET)的特别服务。

2.2 Redis 缓存 & 共享缓存

  • redis的缓存:针对任意服务器系统,均可进行缓存
  • redis的共享缓存:主要针对分布式系统而言,与本地缓存(如:Google Guava Cache)相对,重在共享

2.2.1 缓存雪崩:若redis挂了,又未存到MySQL,如何解决?

1、问题描述

  • 如果瞬间有大量用户请求数据库,可能会导致查询数据库非常缓慢,甚至会造成数据库挂了的严重后果; 而在redis启动起来后,数据没有提前加载到redis里面,所有用户都是访问mysql。

  • 缓存雪崩可能是因为数据未加载到缓存中,或缓存同一时间大面积的失效(宕机、cache服务挂了或者不响应了),从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机

2、解决思路:缓存预热

怎么预热呢?

1)规划缓存。 就是哪些东西需要放在缓存中。这个在开发初期就应该想明白。用计数器的方式是一种方式。如果频繁访问,db能抗住,那么cache仅仅是为了提升性能。  

2)数据监控分析哪些请求比较频繁,着重优化。  

3)缓存预热功能。在高并发访问时候,加入1万请求,同时压到db可能崩溃,那么在应用启动前对缓存预加载内容也是一种措施。  

4)其实访问不频繁的数据也需要cache的,但可以把变化不大的数据的cache超时时间设长点。

2.X 其他经典问题

2.X.1 什么叫做缓存预加载?具体该怎么做?

  • 定义
    所谓的“预加载”技术,就是在打开网站应用之前,就已经通过某些技术把图片、js、css等耗资源的文件加载到客户端生成缓存,等真正打开网站应用时就不需要再次加载这些文件,从而达到提高网站应用性能和加载速度的目的。

比如:我们一打开视频网站,广告就已经加载好了,而视频加载却很慢,这是因为这些网站做了“预加载”,在用户打开网站时就先把广告内容加载到客户端做了缓存,所以打开广告比打开视频快。

缓存预加载就是把热点数据提前加载到redis里面去。当用户访问了某个资源,需要加载数据,这个时候要尽可能把用户历史访问的数据加载到redis中。

用户的历史访问记录存在日志里。用户的每一次请求,都会记录成日志。只要控制好访问频率,把用户近几天的访问的日志再访问一遍,就可以很快地把历史数据加载到redis中,从而还原用户之前的请求数据。

X 参考文献

标签:缓存,网站,CDN,用户,服务器,设计,局部性,加载
From: https://www.cnblogs.com/johnnyzen/p/17612175.html

相关文章

  • 系统架构设计师笔记第47期:SOA设计标准要求(1)
    SOA文档标准化SOA(Service-OrientedArchitecture)文档标准化是指在设计和实施SOA架构时,采用一致的标准和规范来描述和定义相关的文档和接口。在SOA中,文档标准化的重要性在于确保不同服务之间的互操作性和集成性。通过遵循标准化的文档格式和规范,可以实现服务之间的无缝通信和交互,降......
  • 如何提升 API-First 设计流程
    一个API-First设计应该具有可复用性、互操作性、可修改性、用户友好性、安全性、高效性、务实性,并且重要的是,与组织目标保持一致。这些基本特征将确保API能够有效地为API-First组织战略和开发模式做出贡献,在这种模式中,API可以最大限度地为业务创造价值。但如何生成这样的......
  • 从实际案例出发,一文讲明如何设计小程序事件系统
    事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息,如id,dataset,touches。事件分为冒泡事件和非冒泡事件.冒泡事件:当一个组件上的事件被触发后,该事件......
  • CAXA 3D实体设计2023(3D CAD设计软件)中文永久使用
    CAXA3D实体设计是一款专业的三维实体建模和设计软件,广泛应用于工业设计、机械设计和制造等领域。它具有强大的功能和灵活的工作流程,能够帮助设计师高效地创建和编辑复杂的三维模型。点击获取CAXA3D 首先,CAXA3D实体设计提供了丰富的建模工具和功能。用户可以使用各种绘图工......
  • Java设计模式的七大基本原则
    设计模式是为了让程序(软件)具有更好的代码重用性,可读性,可扩展性,可靠性,使程序呈现高内聚,低耦合的特性设计模式的原则其实就收是程序员在编写时,应当遵守的原则,也是各种模式的基础(Java设计模式的七大基本原则)一、单一职责原则<A>对类来说的,即一个类应只负责一项职责,如果A负责......
  • 【Java设计模式004】建造者模式
    大家好,个人gzh是大猪和小猪的小家,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!概述首先来看一个例子,假设我们需要建造一个房子,那么必须建造墙、屋顶、地板、门…如果还需要游泳池、健身室,那么该怎么办呢......
  • Siemens 西门子S7-200SMART PLC八盏灯交替闪烁程序设计
    在学习PLC时,接触很多指令,其中功能指令中的传送指令,传送指令是传送地址或数值,那么对于BOOL型变量是否可以使用呢?这是一个思考的问题,在本文章就给大家详细分析传送指令如何对位进行控制和设计程序。一、传送指令(说明)单个传送指令(把IN数据传送至OUT数据地址)传送存储区大小可分......
  • 如何提升 API-First 设计流程
    一个API-First设计应该具有可复用性、互操作性、可修改性、用户友好性、安全性、高效性、务实性,并且重要的是,与组织目标保持一致。这些基本特征将确保API能够有效地为API-First组织战略和开发模式做出贡献,在这种模式中,API可以最大限度地为业务创造价值。但如何生成这样的A......
  • 基于binlog的全量缓存架构
    binLog的原理基于binlog的全量缓存架构优势降低延迟保证了毫秒级别解决了分布式事务基于ACK机制提升代码的简洁性缺点系统复杂性缓存的数据变多技术优化进行数据筛选进行压缩节约缓存大小使用JOSN的字段替代使用redis的hash结构的字段代替Mysql的binl......
  • 7数据访问层的设计ORM
    ORM是对象与关系数据之间的映射映射表关系:类映射为表对象映射为表的一行记录对象的属性映射为字段 实现技术对比:   Hibernate              MyBatis(iBatis)简单对比    强大,复杂,间接、sql无关。  小巧、简单、直接、SQL相关......