本页面涵盖缓存系统、其架构、实现策略和使用模式。缓存是一种基本的优化技术,通过将频繁访问的数据存储在内存或其他快速访问存储位置来提高性能。有关数据存储的相关主题,请参阅数据库;有关内容交付优化,请参阅CDN。
缓存通过将数据副本临时存储在比原始源更快检索的位置,从而缩短页面加载时间并减少服务器和数据库的负载。这种优化在分布式系统中尤为宝贵,因为数据访问延迟会显著影响性能。
来源
缓存解决了几个关键的性能挑战
数据库通常受益于跨分区读写操作的均匀分布。热门项目可能会使这种分布倾斜,从而产生瓶颈。在数据库前放置缓存有助于吸收这些不均匀的负载和流量峰值。
来源
缓存可以在应用程序堆栈的不同层实现,每一层都有其自身的优势和用例。
来源
缓存可以位于客户端,在操作系统或浏览器内部。客户端缓存通过在本地存储资源来减少网络请求和服务器负载。
来源
内容分发网络(CDN)充当分布式缓存系统,在多个地理位置存储静态内容的副本。它们通过从物理上更接近用户的位置提供内容来减少延迟。
来源
Web服务器可以缓存静态内容和动态响应,以避免重复处理相同的请求。
来源
数据库系统包含为通用用例优化的内置缓存机制。
来源
应用程序缓存涉及位于应用程序逻辑和持久存储之间的内存数据存储。
主要的内存缓存技术包括
| 技术 | 主要功能 |
|---|---|
| Redis | 持久化选项、数据结构(有序集合、列表)、发布/订阅 |
| Memcached | 简单的键值接口、分布式哈希表、仅内存 |
这些内存缓存将数据保存在RAM中,这比典型数据库中存储在磁盘上的数据快得多。由于RAM比磁盘存储更有限,因此LRU(最近最少使用)等缓存失效算法通过删除不常用的条目来为频繁访问的数据腾出空间,从而帮助管理缓存。
来源
缓存可以在不同的粒度级别实现,通常分为两类:数据库查询缓存和对象缓存。
数据库查询缓存使用查询本身作为键来存储整个查询的结果
key = hash("SELECT * FROM users WHERE id = 123")
cache_set(key, query_results)
这种方法存在一些挑战
来源
对象级缓存将数据视为应用程序对象,而不是原始查询结果
常见的缓存对象
来源
有效管理缓存更新对于保持数据一致性并最大化性能优势至关重要。可以根据用例采用几种模式。
来源
在旁路缓存模式中,当发生缓存未命中时,应用程序负责从数据库获取数据并填充缓存。
示例实现
优点
缺点
来源
在直写模式中,应用程序将数据写入缓存,然后缓存同步更新数据库。
示例实现
优点
缺点
来源
在回写模式中,应用程序将数据写入缓存,然后缓存异步更新数据库,从而提高写入性能。
优点
缺点
来源
在预加载刷新模式中,缓存会在常用项目过期之前自动刷新它们,从而减少未来请求的延迟。
优点
缺点
来源
缓存失效是从缓存中删除或更新过期数据的过程。它是缓存最具挑战性的方面之一。
策略包括
维护缓存与真实数据源(数据库)之间的一致性可能具有挑战性,尤其是在分布式系统中。
管理一致性的方法
缓存穿透发生在攻击者反复请求不存在的数据时,绕过缓存直接访问数据库。
缓解措施
缓存雪崩(或缓存崩溃)发生在许多并发请求在缓存条目过期后尝试重新生成同一条目时。
缓解措施
来源
虽然缓存提供了显著的性能优势,但它也带来了挑战
来源
缓存是一种强大的技术,用于提高系统性能和减轻后端服务的负载。通过在不同级别策略性地实现缓存并采用适当的更新模式,应用程序可以在管理复杂性和一致性权衡的同时,实现显著的性能提升。
缓存策略的选择应考虑
有效的缓存需要持续的监控和改进,以确保随着应用程序使用模式的演变而保持最佳性能。
来源