系统架构实战:优化你的缓存失效策略,提升性能

2023年 7月 17日 28.5k 0

缓存失效是从缓存中移除或更新过时数据的过程,以确保仅存储最新、最准确的信息。缓存通过临时在内存中存储频繁访问的数据,提高了应用程序的性能,减少了从较慢的存储系统中获取数据的需求。然而,当原始数据发生变化时,必须更新或使缓存失效,以保持数据的一致性。

1、缓存失效策略

存在几种缓存失效策略,每种策略都有其优缺点:

透写缓存

在这种机制下,数据同时写入缓存和相应的数据库。缓存的数据可以快速获取,由于相同的数据同时写入永久存储,我们可以在缓存和存储间保持完全的数据一致性。此外,这种机制确保在系统崩溃、电力故障或其他系统中断时不会丢失任何数据。虽然透写最小化了数据丢失的风险,但由于每个写操作都必须在返回给客户端成功之前执行两次,因此这种机制的缺点是写操作的延迟较高。

示例:电商网站实时更新其产品库存。每当产品的库存变化时,缓存也会更新以反映新的库存数量。

绕写缓存

这种技术与透写缓存类似,但数据直接写入永久存储,绕过缓存。这可以减少缓存被写操作淹没的情况,这些写操作随后可能不会再被读取,但缺点是对最近写入的数据的读请求会产生“缓存未命中”,必须从较慢的后端存储中读取,因而会经历更高的延迟。

示例:一个应用程序更新用户配置信息,这些信息被访问的频率不高。应用程序将新数据直接写入数据存储,避免了不必要的缓存更新。

回写缓存(或称为懒惰写入)

在这种方案中,数据只写入缓存,并立即向客户端确认完成。根据某些条件(例如,系统需要一些空闲空间时),再将数据写入永久存储。这种方式带来了低延迟和高吞吐量,非常适用于写入密集型应用程序;然而,这种速度也带来了在系统崩溃或其他不利事件发生时的数据丢失风险,因为写入的数据的唯一副本只存在于缓存中。

示例:设想一个协作文档编辑应用程序,该应用程序允许多个用户同时对一个文档进行修改。当用户进行更改时,这些更改首先保存到缓存,使应用程序能快速响应并提供流畅的编辑体验。当满足某些条件(例如,更改数量达到一定阈值)时,应用程序将缓存的更改写回到数据存储,用所有用户的最新更改更新文档。这种方法最小化了对数据存储的写入操作次数,减轻了存储系统的负担,提高了应用程序的整体性能。

后写缓存

它与回写缓存非常相似。在这种方案中,数据被写入缓存并立即向应用程序确认,但并不立即写入永久存储。相反,写操作被推迟,数据最终在稍后的时间被写入永久存储。回写缓存和后写缓存的主要区别在于数据写入永久存储的时间。在回写缓存中,只有在缓存需要释放空间或发生某个事件时,数据才会被写入永久存储。而在后写缓存中,数据会在指定的时间间隔被写入永久存储。

示例:文档编辑应用程序在用户编辑时将更改临时保存到缓存。周期性地,将更改写回到数据存储,以减少写入操作的数量。

2、缓存失效方法

以下是一些著名的缓存失效方法:

清除

清除方法会移除特定对象、URL或一组URL的缓存内容。当内容有更新或变化,并且缓存版本已不再有效时,通常会使用这种方法。收到清除请求后,缓存内容会立即被移除,下一次对内容的请求将直接从源服务器获取。

示例:新闻网站在对特定文章进行了重大更新后,会从其缓存中清除该文章,确保用户获得的是最新版本。

刷新

刷新方法会从源服务器获取请求的内容,即使有可用的缓存版本。当收到刷新请求时,缓存将用来自源服务器的最新版本更新内容,以确保信息的准确性。不同于清除,刷新请求并不移除已存在的缓存内容,而是将其更新为最新版本。

示例:当电商网站有新的促销活动时,会刷新产品页面的缓存,以显示更新后的价格信息。

Ban

Ban方法根据特定的条件(如URL模式或头部信息)使缓存内容失效。收到封禁请求后,任何符合指定条件的缓存内容将被立即移除。后续的内容请求将直接从源服务器获取,以确保用户收到最新且相关的信息。

示例:当某个标签被修改时,内容管理系统会封禁所有带有该特定标签的缓存内容,确保用户只看到更新过的内容。

生存时间(TTL)过期

此方法涉及为缓存内容设置一个生存时间,过了这个时间,内容就被认为是过期的,必须进行刷新。当收到内容请求时,缓存检查生存时间,如果该值尚未过期,就提供缓存的内容。如果该值已过期,缓存就会从源服务器获取内容的最新版本并将其缓存。

示例:天气网站为其天气预报数据设置1小时的生存时间,以确保用户收到相对最新的天气信息,同时不会对源服务器造成过大负担。

旧数据再验证

此方法在网页浏览器和CDN中被用来在背景更新内容时提供旧的缓存内容。当收到某个内容的请求时,立即将缓存版本提供给用户,并向源服务器发送异步请求以获取内容的最新版本。一旦最新版本可用,就更新缓存版本。这种方法确保用户总是可以快速获取内容,即使缓存版本略有过时。

示例:媒体流平台使用旧数据再验证方法提供视频缩略图,确保用户可以快速浏览目录,同时平台在后台更新缩略图图像。

结论

缓存失效策略应谨慎选择,以平衡性能和数据准确性之间的权衡。通过理解不同的缓存失效策略,软件工程师可以选择适当的策略来优化缓存性能,降低延迟,同时确保存储在缓存中的数据准确且最新。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论