关于后端:如何做好缓存设计

42次阅读

共计 3646 个字符,预计需要花费 10 分钟才能阅读完成。

大家好,我是易安!明天咱们来谈一谈缓存应该如何设计。

什么是缓存

缓存是一种长期贮存数据的形式。当用户查问数据时,零碎会首先在缓存中查找,如果数据曾经存在于缓存中,则间接应用,否则零碎会到数据的原始地位寻找。因而,缓存实质上是一种用空间换工夫的技术,通过数据在空间上的反复,进步数据拜访的速度。

然而,随着分布式和云计算技术的一直倒退,数据存储技术也在一直地变动。不同的存储技术在价格和性能上存在微小的差别。因而,在设计软件时,如果没有正当设计多层级的缓存零碎,不仅会节约资金,而且也难以达到冀望的性能收益。

什么时候用缓存

让咱们从两个问题开始,理解缓存设计应该在什么时候进行以及如何依据不同数据类型的个性进行比拟剖析,以实现优良的缓存设计。

  • 在互联网应用服务中,缓存技术的目标仅仅是为了进步访问速度吗?

实际上,缓存技术在分布式系统中表演了一个重要的零碎级性能设计的角色。例如,当某个数据库的负载靠近零碎瓶颈时,咱们能够通过缓存技术将负载摊派到其余数据库中,以实现负载平衡。因而,应用缓存的目标不仅仅是为了进步访问速度。

  • 在大型零碎中,是否须要为每种数据类型都设计缓存机制?

实际上不须要。在理论业务场景中,零碎中蕴含的业务数据品种十分多,无奈为每种数据类型都设计和实现缓存机制。因而,咱们须要辨认哪些数据拜访对性能影响较大,以确定须要应用缓存机制的数据类型。

如何辨认须要应用缓存机制的数据类型呢?个别咱们须要对性能建模设计办法,即通过剖析和评估伎俩,辨认出哪些数据拜访操作对性能影响最为要害,而后进行缓存设计。

在确定须要应用缓存机制的数据类型后,你可能会发现,这些数据类型之间的个性差别十分大,如果应用同一种缓存设计的话,难以施展出软件性能的最佳状态。

因而,在这里,我总结了三种须要应用缓存机制的数据类型:不变性数据、弱一致性数据和强一致性数据。理解这三种数据类型的差别以及对应的缓存机制设计办法,能够帮忙你实现优良的缓存设计。

不变性数据

首先是不变性数据,它代表数据永远不会发生变化,或者在较长一段时间内不会发生变化。因而,咱们能够将这类数据作为优先思考应用缓存技术的一种数据类型,在理论业务场景中也十分常见。例如,Web 服务中的动态网页和动态资源,数据库表中的列数据和 key 的映射关系,以及业务的启动配置等,都能够视为不变性数据。

另外,不变性数据还意味着实现分布式一致性非常容易。咱们能够为这些数据抉择任意的数据存储形式,也能够抉择任意的存储节点地位。因而,在实现缓存机制时,咱们能够采纳灵便且简略的形式。例如,在 Java 语言中,你能够间接应用内存 Caffeine 或内置的数据结构作为缓存。

值得注意的是,在针对不变性数据进行缓存设计时,能够抉择永恒不生效或基于工夫的生效形式作为缓存生效机制。如果采纳基于工夫的生效形式,你还须要依据具体业务需要,在缓存容量和访问速度之间进行衡量。

弱一致性数据

第二种数据类型是弱一致性数据,它代表数据常常发生变化,然而业务对数据的一致性要求不高。换句话说,不同用户在同一时间点上看到的数据可能不完全一致,但这是能够承受的。

因为这类数据对一致性的要求较低,因而在设计缓存机制时,咱们只须要实现最终一致性即可。在理论业务中,这类数据十分常见,例如业务的历史剖析数据和一些搜寻查找返回的数据,即便最近的一些数据没有记录,也不会对业务产生影响。

另外,疾速辨认这类数据还有一个办法,那就是应用数据库 Replica(复制)节点中读取的数据。大部分数据库 Replica 节点的数据都不满足强一致性要求,因而能够认为这些数据是弱一致性数据。

针对弱一致性的数据,咱们通常应用基于工夫的缓存生效机制。因为弱一致性的个性,你能够抉择各种数据存储技术,如内存缓存或分布式数据库缓存。你甚至能够基于负载平衡的调度,设计多层级缓存机制。

强一致性数据

第三种缓存数据类型是强一致性数据,它指的是数据常常发生变化,且业务对数据库的一致性要求十分高。换句话说,任何用户在零碎中的任何中央看到的数据都应该是最新的。

我不倡议在针对这种类型的数据应用缓存机制,因为这会引入新的问题并减少复杂度。例如,用户能够间接提交和批改数据,如果没有同步批改缓存中的数据,就会导致数据不一致性,从而导致重大的业务故障。

但在某些非凡的业务场景中,如果有个别数据拜访频率十分高,咱们仍须要通过缓存机制来晋升性能。在设计缓存机制时,须要留神以下两点:

  1. 缓存的实现形式必须 采纳批改同步 。换句话说,所有的数据批改都必须同步更新缓存和数据库中的数据。
  2. 须要确定特定业务流程中缓存数据能够 应用多长时间 。例如,某些缓存数据只能在单个业务流程中应用,不能跨业务流程应用。

须要留神的是,应用缓存目标是为了性能优化,因而须要应用评估模型来剖析缓存是否达到了性能优化的指标。

评估模型公式为:AMAT = Thit + MR * MP,其中:

  • AMAT(Average Memory Access Time)代表均匀内存拜访工夫;
  • Thit 指的是命中缓存后的数据拜访工夫;
  • MR 指拜访缓存的失效率;
  • MP 指缓存生效后,零碎拜访缓存的工夫与拜访原始数据申请的工夫之和。

留神,AMAT 与原始数据拜访之间的差别代表应用缓存所带来的访问速度晋升。在一些不当的缓存应用场景中,减少的缓存机制可能会升高数据访问速度。因而,接下来我将通过实在的缓存设计案例,带你了解如何正确应用缓存,以晋升零碎性能。

典型场景

好,在开始介绍之前呢,我还想给你阐明一下,在实在的业务中,缓存设计的场景其实有很多,这里我的目标次要是让你明确缓存设计的办法。因而,我会从两个比拟典型的案例场景动手,来带你了解缓存的应用。

如何做好动态页面的缓存设计?

在 Web 应用服务中,一个重要的利用场景就是动态页面的缓存应用。这里的动态页面是指一个网站内,所有用户看到的都是一样的页面,除非重新部署否则个别不产生变更,比方大部分公司官网的首页封面等。

通常动态页面的拜访并发量是比拟大的,如果你不应用缓存技术, 不仅会造成用户响应时延比拟长,而且会对后端服务造成很大的负载压力

那么针对动态页面,咱们在应用缓存技术时,能够通过将动态缓存放到间隔用户近的中央,来缩小页面数据在网络上的传输时延。当初,咱们来看一个针对动态页面应用缓存设计的示意图:

如图上所示,针对动态网页,首先你就能够在软件后端服务的实例中应用缓存技术,从而防止每次都要从新生成页面信息。而后,因为动态网页属于不变性数据,所以你能够应用内存或文件级缓存。另外,针对访问量十分大的动态页面,为了进一步缩小对后端服务的压力,你还能够将动态页面放在网关处,而后利用 OpenResty 等第三方框架减少缓存机制,来保留动态页面。

除此之外,在网页中很多的动态页面或动态资源文件,还须要应用浏览器的缓存,来进一步晋升性能。

留神 ,这里我并不是倡议你针对所有的动态页面,你都须要设计三层的缓存机制,而是你要晓得,在软件设计阶段,个别就须要思考如何做动态页面的缓存设计了。

设计数据库多级缓存

还有一个典型的缓存场景是针对数据库的缓存。当初的数据库通常都是分布式存储的,而且规模都比拟大,在针对大规模数据进行查问与剖析计算时,都须要破费肯定的工夫周期。

因而,咱们能够先辨认出这些计算结果中能够应用缓存机制的数据,而后就能够应用缓存来晋升访问速度了。上面是一张针对数据库缓存机制的原理图:

从图上咱们能够看到,内存级 Cache、分布式 Cache 都能够作为数据计算剖析后果的缓存。而且,不同级的缓存访问速度是不一样的,内存级的 Cache 访问速度能够到微秒级别,甚至更好;分布式 Cache 访问速度通常能够小于毫秒级别;而针对原生数据库的查问与剖析,通常是大于毫秒级别的。

因而,在具体设计缓存机制的时候,你就须要根据后面我介绍的缓存应用原理,辨认出数据类型,而后抉择并设计缓存实现机制。

另外,在应用缓存机制实现访问速度优化的过程中,咱们的 次要关注点是不同层级缓存所带来的访问速度晋升 ,而在这里,不同层级缓存也是能够在一个数据库中的。比方,在我参加设计的一个性能优化我的项目中,其 Cache 策略就是,应用 MongoDB 中的另外一个 Collection(汇合),来作为缓存查问剖析,以此优化性能。

所以,你在做缓存设计时,关注点应该放到不同的数据品种,以及不同层级缓存的性能评估模型上,而不是只关注数据库。只有这样,你能力设计出更好、更优的性能缓存计划。

总结

本文重点介绍了缓存技术的应用原理和典型利用场景,当你在进行软件业务零碎性能设计时,能够联合本文内容,辨认出零碎中各种可缓存的数据类型,而后有针对性地设计缓存计划,并且还能够依据评估模型,来进行后期的性能验证剖析。

另外,在具体的缓存技术实现中,比方缓存替换算法、缓存生效策略等,通常这部分能力是内置于缓存库的配置选项当中的,或者选用第三方库即可,须要自定义设计算法的实现场景很少。所以这里你须要重点做的,就是抉择适合的配置和策略即可。

本文由 mdnice 多平台公布

正文完
 0