第 6 章 分布式缓存 分布式缓存
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
缓存存在于应用程序的许多地方。运行应用程序的 CPU 具有快速的多级硬件缓存,可减少相对较慢的主内存访问。数据库引擎可以利用主内存来缓存数据存储的内容,这样在很多情况下,查询就不必接触相对较慢的磁盘。
分布式缓存是可扩展系统的重要组成部分。缓存可使昂贵的查询和计算结果以较低的成本供后续请求重复使用。由于无需为每次请求重建缓存结果,系统的容量得以提高,并可扩展以处理更大的工作负载。
本章将介绍两种缓存方式。应用缓存要求业务逻辑包含缓存和使用分布式缓存访问预计算结果。网络缓存利用 HTTP 协议内置的机制,在互联网提供的基础架构内实现结果缓存。如果使用得当,这两种方法都能保护您的服务和数据库免受大读取流量负载的影响。
应用缓存
应用缓存的目的是通过将查询和计算结果存储在内存中,以便以后的请求可以使用,从而提高请求的响应速度。例如,读者可以在在线报纸网站上发表评论。文章一旦发布,即使有变化,也不会经常变化。新的评论往往在文章发表后不久就会发布,但随着文章年龄的增长,频率会迅速下降。因此,一篇文章可以在首次访问时被缓存,并被所有后续请求重复使用,直到文章更新、新评论发布或没有人再想阅读它为止。
一般来说,缓存可以减轻数据库的大量读取流量,因为许多查询可以直接从缓存中进行。同时,缓存还能降低构建成本高昂的对象的计算成本,例如,需要跨多个不同数据库查询的对象。这样做的净效果是减少了服务和数据库的计算负荷,并为更多请求创造了裕度或容量。
缓存需要额外的资源和成本来存储缓存结果。不过,与升级数据库和服务节点以应对更高的请求负载相比,精心设计的缓存方案成本较低。作为缓存价值的体现,Twitter大约有3% 的基础设施专门用于应用级缓存。在 Twitter 的规模上,运行着数百个集群,这是一个庞大的基础设施!
应用级缓存利用 专用分布式缓存引擎。该领域的两种主流技术是memcached和Redis。这两种技术本质上都是分布式内存哈希表,用于存储代表数据库查询结果或下游服务 API 调用结果的任意数据(字符串、对象)。缓存的常见用例包括存储用户会话数据、动态网页和数据库查询结果。缓存在应用服务中显示为单个存储,对象通过对象键的散列函数分配给各个缓存服务器。
基本方案如图 6-1 所示。服务首先会检查缓存,看所需数据是否可用。如果是,它将返回 缓存内容作为结果,这就是所谓的缓存命中。如果缓存中没有数据--即缓存未命中,服务就会从数据库中检索所请求的数据,并将查询结果写入缓存,这样就可以在不查询数据库的情况下满足客户的后续请求。
图 6-1. 应用级缓存
例如,在繁忙的冬季度假胜地,滑雪者和滑雪板爱好者可以使用移动应用程序估算整个度假胜地的缆车等候时间。这样,他们就可以制定计划,避开需要等待 15 分钟或更长时间才能乘坐缆车的拥挤区域!
每次有滑雪者搭乘缆车时,都会有一条信息发送到公司的服务系统,该系统会收集滑雪者流量模式的数据。利用这些数据,系统可以根据乘坐缆车的滑雪者人数和到达速度估算出缆车等待时间。这种计算耗资巨大,繁忙时可能需要一秒或更长时间,因为它需要汇总可能数以万计的缆车乘坐记录并进行等待时间计算。因此,一旦计算出结果,其有效期为五分钟。只有过了这段时间,才会进行新的计算并得出结果。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access