共计 3429 个字符,预计需要花费 9 分钟才能阅读完成。
在设计缓存零碎时须要思考不同缓存策略的优缺点和实用场景,通过理解和利用这些策略,能够优化缓存零碎的性能和效率。原文: 6-Caching Strategies to Remember while designing Cache System
前言
缓存的指标是缩小从原始数据源获取数据的次数,从而放慢处理速度并缩小提早。
缓存能够在不同体系架构级别上实现,包含内存缓存、磁盘缓存、数据库缓存和 CDN 缓存。
能够用不同的技术缓存数据,每种技术都有其优缺点。比方内存缓存将数据存储在计算机主内存中,与磁盘缓存相比,能够实现更快的访问速度。
另一方面,磁盘缓存将数据存储在硬盘上,速度比内存慢,但绝对拜访近程数据源的速度还是要快得多。
应用数据库缓存,将频繁拜访的数据存储在数据库中,从而缩小从内部存储检索数据的须要。
最初,CDN 缓存将数据存储在分布式服务网络中,从而缩小拜访近程数据的时延。
目录
- 缓存零碎要害性能指标
- 读密集型利用缓存
- 写密集型利用缓存
- 缓存生效办法
- 论断
缓存零碎要害性能指标
为了进步缓存零碎的效率和性能,十分重要的一点是须要监控各种指标,从而依据指标做出无关缓存零碎的重要业务决策。
须要思考的参数有:
- 缓存命中率: 该指标掂量申请项在缓存中被找到次数的百分比。较高的缓存命中率意味着缓存能够提供更多数据,从而缩小拜访内部存储并进步性能。
- 时延: 时延是指拜访数据所需工夫。在缓存零碎中,较低的时延意味着数据服务速度更快,从而进步整体性能。
- 吞吐量: 吞吐量度量在给定工夫范畴内能够解决的数据量。高吞吐量的缓存零碎能够解决更多申请,提供更多数据,从而进步整体性能。
- 缓存大小: 缓存大小是为缓存调配的内存或存储的容量。缓存大小会影响缓存命中率,较大的缓存能够进步命中率,但也会减少缓存解决方案的老本和复杂性。
- 缓存未命中率: 此指标度量申请项在缓存中找不到并且须要从内部存储中获取的次数百分比。高缓存未命中率意味着须要从内部存储获取更多数据,从而对性能造成影响。
如果始终监控这些性能指标,就能够据此优化缓存零碎,以取得更高的吞吐量和更低的时延。
读密集型利用缓存
读密集型利用 (如 Wordpress/ 动态图像网站) 须要设计缓存零碎,以反对更多的读缓存。
上面是一些有用的办法:
- Cache-aside
- Cache-through
- Refresh-ahead
1. Cache-Aside
Cache-aside 办法是最罕用的缓存策略之一。
办法
- 每当利用发送申请,首先查看缓存中是否有申请的数据。
- 如果有,返回缓存的数据。
- 否则,应用程序从数据库查问数据,并在返回途中更新缓存,而后返回数据。
优缺点
- 每次缓存未命中都会导致三次拜访,可能会造成显著的时延。
- 如果有人更新数据库而不写入缓存,可能会读到过期数据。(因而,Cache-aside 通常与其余策略一起应用)。
2. Read-through
在 read-through 办法中,缓存对数据库进行读取 / 查问操作,而后更新本人并将申请数据返回给最终用户。
办法
- 应用程序每次都从缓存中查问数据。
- 如果数据不在缓存中,则 缓存 查询数据库并更新本人。
- 缓存将数据返回给最终用户。
优缺点
- 简化利用程序代码,read-through 策略确保将数据获取逻辑转移到缓存中,从而简化了利用程序代码。
- 更好的读取可伸缩性。当某个 key 在 Cache-aside 中过期时,并发申请可能会触发屡次数据库查问雷同的数据。在 Read-through 中,缓存确保只向数据库发送一个查问。
3. Refresh-ahead
Refresh-ahead 策略是在过期之前刷新缓存数据,该办法实用于热数据,即预计在不久的未来会被申请的数据。
办法
- 假如缓存数据的过期工夫为 60 秒,刷新提前系数为 0.5。
- 如果缓存数据在 60 秒后被拜访,将从缓存存储执行同步读取以刷新其值。
- 如果缓存数据在 30 秒后被拜访,比方第 35 秒,缓存将间接返回数据,并异步刷新数据。
优缺点
因而,refresh-ahead 缓存实质上是在下一次可能的缓存拜访之前以配置的距离刷新缓存。在这种读流量十分高的零碎中,几毫秒内可能会产生几千个读操作。
写密集型利用缓存
任何写密集型应用程序都须要缓存策略,例如:
1. Write-Through
Write-Through 策略将缓存作为其主数据存储,即首先在缓存中更新数据,而后才在数据库中更新数据。
上面是利用想要写入数据或更新值时产生的状况:
- 应用程序将数据间接写入缓存。
- 缓存更新主数据库中的数据。当写操作实现时,缓存和数据库都具备雷同的值,并且始终保持统一。
优缺点
当与 read-through 配合应用时,在网络调用中十分无效,数据首先被读 / 写到缓存中,使得简直不会产生缓存有效的状况。因为所有数据都是新的和常常拜访的数据,而且所有对数据库的写入都是通过缓存实现,使得数据库和缓存简直始终保持统一。
2. Write-back
Write-back 办法与 write-through 十分类似,只是数据库写调用是异步的。
优缺点
- Write-back 缓存能够进步写性能,非常适合波及大量写操作的工作负载。当与 read-through 联合应用时,也非常适合混合工作负载,能够确保最近更新拜访的数据始终在缓存中可用。
- 升高网络老本: 如果应用批处理调用,还能够缩小对数据库的总体写操作,从而缩小负载并降低成本,特地是当数据库按申请数量免费时(例如 DynamoDB)。
- 缓存应用效率低下: 不常常被申请的数据也会被写入缓存。这点能够通过 TTL 进行优化。
3. Write-around
在 Write-around 办法中,首先将数据更新到数据库,而后数据库对缓存进行异步调用以更新 key。
办法
- 当收到写申请时,应用程序更新数据库中的记录。
- 数据库异步更新 / 删除缓存中的键。
优缺点
Write-around 能够与 read-through 联合应用,在数据只写入一次,读取频率较低或从不读取的状况下提供良好的性能(例如实时日志或聊天室)。同样,这种模式也能够与 cache-aside 联合应用。
缓存生效办法
缓存生效是从缓存中删除古老或过期数据的过程,以确保只保留最新的可用数据。缓存生效策略有:
- 基于工夫生效(TTL): 在此策略中,缓存数据在通过一段时间后生效。这是一个简略而无效的策略,易于施行,但可能并不适用于所有用例,因为有些数据可能比其余数据更容易过期。
- 基于事件生效 : 在此策略中,缓存数据将依据产生的特定事件(如底层数据源更改或其余相干事件) 生效。这是一种更有针对性的生效办法,可确保数据仅在必要时生效,但须要与利用和底层数据源进行更档次的集成。
- 基于版本生效: 在此策略中,为缓存中的每个数据块调配一个版本号,该版本号在每次数据更改时递增。当数据生效时,将在缓存中更新版本号,以确保仅应用数据的最新版本。这种策略对于频繁更改的数据成果很好,但须要额定的开销来治理版本号。
- 最近起码应用 (Least recently used, LRU) 生效: 在此策略中,当缓存达到容量限度时,缓存中最近起码应用的数据将生效,从而确保在缓存中保留最罕用的数据,升高存储古老数据的危险。然而,该机制可能并不适宜所有用例,因为有些数据可能不被常常拜访,但依然须要缓存。
- 手动生效: 在此策略中,生效由应用程序或管理员手动触发。该机制提供了最大的灵活性和对缓存的管制,但须要更多开销来治理生效过程。
具体生效办法包含革除、禁止、刷新等。
论断
总之,上文提到的策略永远不会独自或孤立的起作用,而总是组合工作。例如,Write-around 策略能够与 Cache-aside 策略一起实现,以确保数据一致性。更重要的是,应该理解应用程序的读 / 写访问模式,因为抉择谬误的组合可能无奈带来最好的后果。
例如,如果在理论应该应用 write-around/read-through(写入的数据拜访频率较低)时抉择了 write-through/read-through,那么缓存中就会有无用的垃圾。
你好,我是俞凡,在 Motorola 做过研发,当初在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。为了不便大家当前能第一工夫看到文章,请敌人们关注公众号 ”DeepNoMind”,并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的反对和能源,激励我继续写下去,和大家独特成长提高!
本文由 mdnice 多平台公布