缓存架构,减少不必要的计算

2024-03-19 02:59

本文主要是介绍缓存架构,减少不必要的计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算的资源,应对高并发带来的计算压力以及资源的消耗。

缓存:

就是将需要多次读取的数据暂存起来,这样在后面,应用程序需要多次读取的时候,就不必从数据源重复加载数据了,这样就可以降低数据的计算负载压力,提高数据的响应速度。

通读缓存(read-through):

应用程序访问通读缓存获取数据的时候,如果通读缓存有应用程序需要的数据,那么就返回这个数据,如果没有,那么通读缓存就自己负责访问数据源,从数据源获取数据返回给应用程序,并且将这个数据缓存在自己的缓存中,这样,下次,应用程序需要数据的时候,就可以通过通读缓存直接获取数据了。

通读缓存在架构中的位置与作用如下图

旁路缓存(cache-aside):

应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应用程序需要的数据,那么就返回这个数据,如果没有,就返回空,应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中,这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获取数据了。

通读缓存:

互联网应用中主要使用的通读缓存是CDN和反向代理缓存。

CDN(Content Delivery Network)内容分发网络,上网的时候,APP或者浏览器想要连接到互联网的应用服务器,需要网络服务商,比如移动,电信这样的服务商为我们提供网络服务,建立网络连接才可以上网。

而这些服务商需要在全国范围内部署骨干网络,交换机机房才能完成网络连接服务,这些交换机机房可能距离用户非常近,用户在近距离获取自己想要的数据,既能提高响应速度,又能节省网络带宽和服务器资源。

部署在网络服务商机房中的缓存就是CDN,因为距离非常近,又被称作网络连接第一跳,目前很多网络应用大约80%以上的网络流量都是通过CDN返回的。

CDN只能缓存静态数据内容,比如说图片、CSS、JS、HTML等内容,而动态内容,比如说订单的信息,商品搜索结果等必须要应用服务器进行计算处理后才能获得,因此,互联网应用的静态内容和动态内容需要进行分离,静态内容和动态内容部署在不同的服务器集群上面,使用不同的二级域名,即所谓的动静分离,一方面便于运维管理,另一方面也便于CDN进行缓存,使CDN只缓存静态内容。

反向代理缓存是一种通读缓存:

上网的时候,有时候需要通过代理上网,这个代理就是代理我们客户端上网设备,而反向代理则是代理服务器,是应用程序服务器的门户,所有的网络请求都需要通过反向代理磁能到达应用程序服务器,既然所有的请求都需要通过反向代理才能到达应用服务器,那么在这里加一个缓存,尽快将数据返回给用户,而不是发送给应用服务器,这就是反向代理缓存。

用户请求到达反向代理缓存服务器,反向代理检查本地是否有需要的数据,如果有就直接返回,如果没有,就请求应用服务器,得到需要的数据后缓存到本地,然后返回给用户。

旁路缓存:

CDN和反向代理缓存通常 会作为系统架构的一部分,很多时候对应程序都是透明的,而应用程序在代码中主要使用的是对象缓存,对象缓存是一种旁路缓存。

不管是通读缓存还是旁路缓存,缓存通常都是以key、value的方式进行存储在缓存中的,比如说,CDN和反向代理缓存,每个URL是一个key,那么url对应的文件内容就是value,而对象缓存中,key通常是一个ID,比如说用户的ID,商品ID等等,而value则是是一个对象,就是ID对应的用户对象或者商品对象。

对于key、value的数据格式,比较快速的存取方式就是使用hash表,因此通读缓存和旁读缓存存在实现上基本都是使用hash表。

程序中的使用的对象缓存,可以分为两种,一种是本地缓存,缓存和应用程序在同一个进程中启动,使用程序的堆空间存放缓存数据,本地缓存的响应速度快,但是缓存可以使用的内存空间比较小,但是对于大型互联网应用所需缓存的数据通常以T计算,这个时候就要使用远程分布式缓存进行处理了。

分布式缓存是指将一组服务器构成一个缓存集群,共同对外提供缓存服务,那么应用程序在每次读写缓存的时候,如果知道要访问缓存集群中的具体那台服务器,通过Memcached为例子,分布式缓存的框架:

Memcached将多台服务器构成一个缓存集群,缓存数据存储在每台服务器的内存中,事实上,使用缓存的应用程序服务器通常也是以集群方式部署的,每个程序需要依赖一个Memcached的客户端SDK,通过SDK的API访问Memcached的服务器。

应用程序调用API,API调用SDK的路由算法,路由算法根据缓存的key值,计算这个key应用访问那台Memcached服务器,计算得到服务器的IP地址和端口后,API再调用SDK的通信模块,将key、value值以及缓存操作命令发送给具体的某台Memcached服务器,由这台服务器完成缓存操作。

路由算法计算Memcached的服务器IP端口,比较简单的方法是通过Hash算法一样,利用Key的Hash值对服务器列表长度取模,根据余数可以确定服务器列表的下标,进而得到服务器的IP和端口。

缓存的好处事项:

  1. 缓存数据通常存储在内存中,距离使用数据的应用也更近一些,因此相比从硬盘上获取,或者从远处网络上获取,它获取数据的速度要更快一点,响应时间更快,性能表现更好。
  2. 缓存的数据通过是计算后的结果,比如对象缓存中,通常存放经过计算加工的结果对象,如果缓存不命中,那么就需要从数据库中获取原始数据,然后进行加工才能得到结果对象,因此使用缓存可以减少CPU的计算消耗,节省计算资源,同样也加快了处理的速度。
  3. 通过对象缓存获取数据,可以降低数据库的负载压力,通过CDN,反向代理等通读缓存获取数据,可以降低服务器的负载压力,这些负载压力释放出来的计算资源,可以提供个其他更有需要的计算场景,比如写数据场景,间接提高整个系统的处理能力。

缓存的缺点:

  1. 数据脏读取的问题,缓存的数据来自数据源,如果数据源中的数据被修改了,那么缓存中的数据就编程脏数据了。
    1. 解决方案1:过期失效,每次写入缓存中的数据都标记其失效的时间,在读取缓存的时候,检查数据是否已经过期失效,如果失效,就重新从数据源获取数据,缓存失效依然可能会在未失效内读取到脏数据,但是一般的应用都可以容忍较短时间内数据的不一致问题。
    2. 解决方案2:失效通知,应用程序更新数据源的数据,同时发送通知,将该数据从缓存中清除,失效通知看起来的数据更新及时,但是实践中,更多使用的还是过期失效。

小结:

不是所有的数据使用缓存都有意义,在互联网应用中,大多数数据访问都是有热点的,比如说微博的热点新闻,名人博客等,可以使用缓存进行处理。相反,如果缓存的数据没有热点,写入缓存的数据就很难被重复读取,使用缓存 就没有必要了。

这篇关于缓存架构,减少不必要的计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824575

相关文章

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k