本文档全面概述了后端架构中使用的缓存系统,涵盖了不同类型的缓存策略、实现技术以及流行的缓存技术,如 Redis、Memcached 和 Tair。有关特定的数据库缓存机制,请参阅数据库;有关CDN相关的缓存,请参阅网络与通信。
缓存是一种将频繁访问的数据存储在高速存储层中的技术,旨在减少数据检索延迟并减轻后端系统的负载。在现代架构中,缓存对于性能优化、可伸缩性和高可用性至关重要。
实现缓存的主要优势
来源:README.md:138-147
后端架构定义了三种主要的缓存系统类型
来源:README.md:138-147
本地缓存将数据存储在应用程序的内存空间中,提供最低的延迟,但受限于单个服务器的内存。
| 缓存类型 | 特性 | 用例 |
|---|---|---|
| 基于 HashMap | 简单的内存实现 | 小数据量、单实例应用 |
| EhCache | 基于 Java,支持磁盘、内存和分布式缓存 | Java 应用,Hibernate 集成 |
| Guava Cache | Google 的高性能缓存库 | 需要精细控制逐出的应用程序 |
来源:README.md:139, 1056-1064
客户端缓存将数据存储在客户端设备上,减少网络往返并增强用户体验。
来源:README.md:140, 1070-1076
服务端缓存运行在独立于应用程序的专用服务器或进程上,支持分布式部署和更高的容量。
Web 缓存充当客户端和应用服务器之间的中间层,存储 HTTP 响应。
实现包括
来源:README.md:142, 1081-1083
Memcached 是一个为简单性和速度而设计的高性能分布式内存缓存系统。
主要特点:
来源:README.md:143, 1085-1096
Redis (REmote DIctionary Server) 是一个内存数据结构存储,可用作数据库、缓存和消息代理。
主要功能:
来源:README.md:144-146, 1100-1116
Tair 是阿里巴巴开发的一个分布式缓存系统,支持多种存储引擎。
主要特点:
来源:README.md:147, 1117-1129
当缓存达到容量限制时,需要确定要删除哪些条目
| 策略 | 算法 | 优点 | 缺点 |
|---|---|---|---|
| FIFO | 先进先出 | 实现简单 | 不考虑使用频率 |
| LRU | 最近最少使用 | 适应时间局部性 | 需要访问跟踪 |
| LFU | 最不经常使用 | 优化流行度 | 对模式变化适应慢 |
| TTL | 存活时间 | 简单过期 | 可能会逐出仍然有用的数据 |
来源:README.md:1050-1051
不同的模式决定了应用程序与缓存的交互方式
来源:README.md:1054-1064
Redis 对大多数操作采用单线程事件循环架构
来源:README.md:1111-1112
当达到最大容量时,Redis 采用多种策略来管理内存
来源:README.md:146, 1114-1115
| 功能 | Redis | Memcached | Tair |
|---|---|---|---|
| 数据结构 | 丰富 (字符串、列表、集合、哈希等) | 简单键值 | 根据引擎有多种格式 |
| 持久化 | RDB 快照, AOF 日志 | 无 | 取决于存储引擎 |
| 内存效率 | 因数据结构效率较低 | 高效率 | 因引擎而异 |
| 聚类 | 原生 Redis Cluster | 客户端分片 | 内置集群 |
| 复制 | 主从 | 无 | 可配置的冗余 |
| 内存管理 | maxmemory + 逐出策略 | Slab 分配 | 根据引擎有多种策略 |
| 原子操作 | 广泛支持 | 基本 CAS 操作 | 有限 |
| 用例 | 复杂数据操作、消息、会话存储 | 简单高吞吐量缓存 | 企业级分布式缓存 |
来源:README.md:143-147, 1085-1129
缓存穿透是指持续查询不存在的键,从而绕过缓存直接访问数据库的情况。
解决方案:
来源:README.md:1050-1096
缓存雪崩是指大量缓存条目同时失效或缓存服务完全故障的情况。
解决方案:
来源:README.md:1054-1076
维护缓存和数据库之间的一致性是一个基本挑战
来源:README.md:1050-1116
来源:README.md:1050-1129
缓存系统是现代后端架构中的重要组成部分,可显著提高性能并减轻主数据存储的负载。选择本地缓存、客户端缓存还是服务端缓存,以及选择 Redis、Memcached 或 Tair 等特定技术,取决于具体的应用程序需求,包括数据复杂性、一致性要求和规模。
在实施缓存时,架构师必须仔细考虑适当的缓存策略、潜在问题(如缓存穿透和雪崩),并建立适当的监控和维护程序,以确保最佳性能。