您需要了解的有关缓存的所有信息



美好的一天。

我向您介绍了Animesh Gaitonde 的文章“您需要了解的有关缓存的所有知识-系统设计”的翻译。

介绍


您是否注意到在浏览互联网连接不良的网页时,在高质量图像之前加载了文本?但是,当您再次访问同一页面时,它加载得更快。当您访问新站点时,下载该站点所花的时间要比下载经常访问的站点(如Facebook或Amazon)要长得多。你知道为什么会这样吗?全部与缓存有关。



这是我的Instagram页面在缓慢连接时的样子。如您所见,在尚未加载图像时显示文本。

提供使用该应用程序的最佳体验以保留和吸引用户非常重要。在竞争精神盛行的现代世界中,由于糟糕的用户体验,业务遭受了巨大损失。想象一下,您正在网站上观看自己喜欢的系列节目或流媒体视频,但是视频会不断停止以进行其他加载(缓冲)。您会忍受这种态度多长时间,并且您会回到这样的位置?

缓存的工作原理是“链接本地化”。缓存是一个本地数据仓库,可加快信息检索和数据恢复的速度。高速缓存的主要目的是减少读取数据的延迟并提高应用程序的吞吐量。让我们看一些现实生活中的例子。

缓存使用率


假设您每天做饭。为了烹饪,您需要各种食材,蔬菜,香料等。但是,您每天为此去商店吗?这可能是相当繁重且耗时的。当然,首先要看的是厨房或冰箱里的壁橱。这有助于避免不必要的去超市旅行。



您的冰箱是种蔬菜的缓存。此缓存的明显优势是可大大节省晚餐准备时间。

缓存如何工作?


服务器应用程序通常将数据存储在数据库中。当客户端请求数据时,应用程序向数据库发送请求,从数据库接收数据,然后将其发送给客户端。数据库服务器处于脱机状态,并且可以与应用程序服务器所在的计算机位于不同的计算机上。



从数据库读取数据是一个非常缓慢的过程,因为您需要发送一个请求并执行I / O以从文件系统中获取数据。如果数据存储在缓存中,则读取操作将非常快。当客户端重复请求相同的数据时,从缓存而不是从数据库返回数据是有意义的。

例如:如果一条推文具有病毒性,则所有客户端都将请求同一条推文的数据。由于Twitter有数百万个用户,因此使用缓存可以避免数百万个数据库查询。

因此,缓存减少了数据库的负载。如果请求的数据在缓存中,则数据库请求将被重定向(拦截)。您可以使用存储键-值对的哈希表进行类比。

下图显示了从缓存中读取数据的过程:



关键缓存概念


生存时间(TTL)


这些是可以存储在缓存中的数据量的限制。您必须删除缓存中应用程序服务器不再需要的条目。

对于Netflix,服务器将缓存观看次数最多或最受欢迎的节目。无需缓存显示没有人观看的节目。

例如:缓存Paper House系列比印第安纳·琼斯电影更合理。

删除政策


在某些时候,缓存已满。因此,需要删除旧的(不相关的)数据并将其替换为新的(相关的)信息。

有几种清除缓存的策略,例如“旧(最近使用)”(最近最少使用,LRU),“很少请求(最近使用)”(最少经常使用,LFU),“最近(最近使用)”(最近使用的MRU)。这些策略根据特定原理从缓存中删除数据。


长时间未请求的数据将从缓存中删除。一旦缓存已满,旧数据将被删除,新数据将被添加。

假设Facebook缓存名人照片。对订户请求的分析表明新照片的相关性。当缓存已满时,最旧的照片将从其中删除。

很少要求


LFU跟踪数据请求的频率或数量。当高速缓存大小接近阈值时,将删除请求次数最少的数据。

当我们输入文字时,手机开始提供各种选项来结束单词,您可以选择其中一种而不是全部(自动完成)。智能手机软件会缓存最常用的单词。



随后,从此缓存中删除很少键入的单词。在上面的示例中,如果您使用“功能”,“功能”,“羽毛”等字眼,则一段时间后,手机将停止为您提供“壮举”,因为它将从缓存中删除。

持续


在此策略中,最新数据将被删除,优先考虑存储在缓存中的旧数据。如果数据获取模板使得用户对检索最新数据最不感兴趣,则使用此策略。考虑一个例子。



约会应用程序(例如Tinder)通常会缓存用户的所有潜在合作伙伴(潜在匹配或偏好)。当用户通过左右移动潜在合作伙伴的特定配置文件浏览提要时,应用程序不应再向他推荐此配置文件。如果发生这种情况,将导致不良的用户体验。

在这种情况下,需要删除最新数据。应用程序应删除从缓存中查看的配置文件。

缓存类型


缓存记录


顾名思义,数据首先写入高速缓存,然后再写入数据库。这样可以确保高速缓存和数据库中的数据一致性。从缓存中读取的每个数据都对应于最近的记录。



这种方法的缺点是增加了记录时间。它不适用于具有频繁数据写入操作的重负载系统。但是,这对于经常重新读取存储在数据库中的数据的应用程序非常有用。快速阅读和一致性抵消了慢速书写的麻烦。

缓存条目


第一种方法的替代方法是将数据写入高速缓存,并添加有关数据更改的注释,以供以后对数据库进行更新。



使用定期异步操作,您可以读取缓存中的更新数据并更改数据库中的相应数据。这种方法不会增加读/写操作。唯一的缺点是缓存和数据库之间的同步延迟。这可能导致这样一个事实,即依赖数据库作为事实来源的应用程序将读取过时的数据。

例如,Youtube使用这种方法来存储有关特定视频的观看次数的信息。为病毒视频的每个视图更新数据库将非常昂贵。最好的解决方案是将数据写入高速缓存,然后与数据库同步。

缓存绕过记录


几个服务器应用程序通常不会重新读取最新数据。在这种情况下,将使用缓存旁路条目。



用这种方法,无需缓存即可更新数据库。这样可以避免将无人认领的数据加载到缓存中。但是,如果应用程序仍然请求不在缓存中的最新数据,则将导致从数据库加载此类数据,并随之而来。

分布式缓存使用示例


打开的缓存项目列表:

  • 雷迪斯
  • 记忆快取
  • 伏特数据库
  • Aerospike dbs
  • 阿帕奇点燃

感谢您的关注。

All Articles