真实面经题目 · 原创解析

还知道哪些缓存中间件?

缓存中间件不只有 Redis。可以按部署位置和能力分为远程内存缓存、进程内本地缓存、分布式缓存、CDN/HTTP 缓存、数据库内部缓存,以及用于削峰和结果复用的消息缓存、结果缓存。回答这题的关键不是罗列产品名,而是说明 Redis、Memcached、Caffeine、Ehcache、Hazelcast、Ignite、CDN、数据库 Buffer Pool 等分别解决什么问题,以及选型时如何比较数据结构、持久化、一致性、延迟和运维复杂度。

出现于:阿里巴巴 · 后端开发

60 秒回答模板

除了 Redis,常见缓存中间件和缓存层还有 Memcached、本地缓存如 Caffeine、Guava Cache、Ehcache,分布式缓存或数据网格如 Hazelcast、Apache Ignite、Infinispan,CDN 和 HTTP 缓存,数据库自身的 Buffer Pool 和执行计划缓存,以及业务里的消息缓存、结果缓存。Redis 适合复杂数据结构、计数器、排行榜、限流、会话、分布式锁等场景;Memcached 更适合简单 KV、高吞吐、低复杂度场景;本地缓存延迟最低但多实例一致性较弱;分布式缓存适合多节点共享状态和水平扩展;CDN/HTTP 缓存适合静态资源和公开内容;数据库缓存主要减少磁盘 IO。选型要看数据模型、是否需要持久化、是否跨实例共享、可接受的不一致窗口、容量、淘汰策略、故障恢复和团队运维能力。

考点 按位置先分类
主线 Redis 的定位
易错点 只回答 Redis,忽略 Memcached、本地缓存…

深入解析

01

按位置先分类

缓存可以按位置分成浏览器缓存、CDN 边缘缓存、网关或反向代理缓存、应用进程内本地缓存、独立缓存服务、数据库内部缓存。位置越靠近用户,链路越短、延迟越低,但一致性越难控制;位置越靠近数据源,一致性更容易治理,但请求路径更长。实际系统常用多级缓存组合,而不是只放一个 Redis。

02

Redis 的定位

Redis 是功能丰富的远程内存缓存,支持 String、Hash、List、Set、ZSet、Bitmap、HyperLogLog、Stream 等数据结构。它不仅能做普通 KV,还能做计数器、限流、排行榜、会话、延迟队列、发布订阅和轻量消息流。代价是治理复杂度更高,需要关注热点 Key、大 Key、持久化抖动、内存碎片、复制延迟和 Cluster 跨槽限制。

03

Memcached 的定位

Memcached 是典型的简单 KV 内存缓存,数据模型主要是字符串或二进制 value,通常不提供 Redis 那样丰富的数据结构,也不强调持久化。它的优势是简单、吞吐高、延迟稳定,适合缓存页面片段、序列化对象、查询结果和会话数据。它不适合排行榜、集合运算、复杂原子操作或需要持久化恢复的场景。

04

本地缓存的边界

Caffeine、Guava Cache、Ehcache 运行在应用进程内,没有网络开销,读延迟最低,适合热点配置、权限元数据、字典表、短时间重复计算结果。它的主要风险是每个应用实例各有一份缓存,更新传播不天然一致,实例越多内存总消耗越大。因此本地缓存常和 Redis 组成二级缓存,并通过 TTL、版本号或消息通知控制失效。

05

分布式缓存和数据网格

Hazelcast、Apache Ignite、Infinispan 等更强调多节点共享状态、分区、副本、节点发现、近端缓存、分布式计算或查询能力。它们适合大规模共享对象、会话集群、低延迟数据网格和需要跨节点扩容的场景。评估时不能只看单机性能,还要看网络分区、复制一致性、再均衡成本、节点扩缩容抖动和故障恢复时间。

06

CDN 和 HTTP 缓存

静态资源、公开页面、公开接口响应和下载文件,通常更适合 CDN、浏览器缓存和反向代理缓存。核心机制包括 Cache-Control、Expires、ETag、Last-Modified、Vary、资源版本号和刷新策略。它们能把流量挡在边缘节点或浏览器侧,减少源站压力。风险是不能把用户私有内容错误缓存为公共内容。

07

选型看约束

选型应回答几个问题:是否需要复杂数据结构,是否需要持久化,是否跨实例共享,是否能容忍短暂不一致,读写比例如何,缓存击穿后数据源能否承受,团队是否熟悉运维。简单 KV 可重建可考虑 Memcached;复杂结构和丰富生态优先 Redis;极低延迟热点数据用本地缓存;静态公开内容交给 CDN/HTTP 缓存。

易错点

  • 只回答 Redis,忽略 Memcached、本地缓存、CDN/HTTP 缓存和数据库缓存等类别。
  • 把缓存和数据库混为一谈,认为 Redis 开启持久化后就可以替代数据库。
  • 只比较性能,不比较数据结构、持久化、淘汰策略、集群能力和一致性要求。
  • 认为本地缓存一定比 Redis 好,却忽略多实例不一致和重复内存占用。
  • 没有设计缓存 Key 规范,导致 Key 冲突、维度缺失、重复缓存或难以清理。
  • 忽略热点 Key、大 Key、缓存击穿、穿透、雪崩和冷启动回源压力。

面试官追问

Redis 和 Memcached 怎么选?

如果只是简单 KV,value 可序列化,数据丢失后能从数据库重建,不需要复杂结构和持久化,Memcached 很轻量。如果需要 Hash、Set、ZSet、Stream,或者做排行榜、计数器、限流、分布式锁、延迟队列、会话共享,Redis 更合适。还要比较团队运维能力和治理成本。

本地缓存和 Redis 能不能一起用?

可以,常见做法是本地缓存做一级缓存,Redis 做二级缓存,数据库做最终数据源。读取先查本地,再查 Redis,最后回源数据库并回填。关键是失效控制,本地缓存通常需要较短 TTL、版本号或消息通知,否则多实例会读到旧值。

缓存是否一定要持久化?

不一定。缓存本质是加速层,数据通常应能从数据库或计算任务中重建。Redis 的 RDB/AOF 适合恢复成本较高、冷启动穿透风险大的场景,但会带来磁盘 IO、恢复耗时和配置复杂度。Memcached 和本地缓存通常不持久化。

数据库有 Buffer Pool,为什么还需要 Redis?

Buffer Pool 缓存的是数据库页,仍要经过 SQL 解析、优化、执行、锁和连接管理。Redis 缓存的是业务层可直接使用的对象或结果,访问路径更短,也能承担简单高频读请求。二者职责不同,前者提升数据库内部效率,后者减少数据库请求压力。

结果缓存应该怎么设计 Key?

Key 应能唯一表达一次查询或计算的输入条件,通常包含业务前缀、版本号、核心参数、分页、排序、用户或租户维度,并对参数做归一化。还要控制结果大小、设置合理 TTL,并在底层数据更新时主动失效或切换版本。