Redis 与 Memcached 对比
面试官问:"你们缓存用的什么?"
候选人小顾答:"Redis。"
面试官追问:"为什么不用 Memcached?两者有什么区别?"
小顾说:"呃... Redis 更流行?"
面试官追问:"那什么场景下用 Memcached 更合适?"
小顾答不上来。
【面试官心理】 这道题考查的是候选人对缓存技术的理解深度。Redis 和 Memcached 都是成熟的缓存方案,能说清楚两者的差异和适用场景,说明真正做过技术评估,而不是盲目从众。
一、核心差异概览
二、数据结构对比 🔴
2.1 Memcached:仅支持字符串
2.2 Redis:支持多种数据结构
对比:Redis 一条命令搞定的事,Memcached 需要序列化/反序列化 + 多次 GET。
三、持久化对比 🟡
3.1 Memcached:无持久化
3.2 Redis:支持持久化
💡
Redis 的持久化是把双刃剑:开启会影响性能,不开启会丢数据。根据数据重要性选择合适的持久化策略。
四、内存管理对比 🟡
4.1 Memcached:Slab Allocator
问题:
- 固定 chunk size,可能浪费内存
- 不同 slab 之间的内存不能共享
- 预分配内存,不灵活
4.2 Redis:动态内存分配
优势:
- 按需分配,不浪费内存
- 支持内存压缩和整理
- 更灵活的内存控制
五、过期策略对比 🔴
5.1 Memcached:懒删除 + 过期线程
5.2 Redis:8种过期策略
六、集群能力对比 🔴
6.1 Memcached:需要客户端实现
问题:
- 需要手动管理节点
- 没有内置的故障转移
- 数据分片逻辑在客户端
6.2 Redis:原生集群支持
七、性能对比 🟡
7.1 单机性能
结论:纯 GET/SET 性能,Memcached 略高,但 Redis 也不差。
7.2 实际场景性能
八、选型决策 🔴
选 Memcached 的场景
- 纯缓存:数据丢了无所谓,可以接受冷启动
- 简单 Key-Value:只需要存字符串
- 追求极致性能:对延迟敏感,单机 QPS 要求极高
- PHP 环境:PHP 的 Memcached 扩展成熟稳定
选 Redis 的场景
- 需要数据结构:列表、集合、有序集合等
- 需要持久化:数据不能丢失
- 需要集群:高可用 + 数据分片
- 需要高级功能:发布订阅、Lua 脚本、Stream
⚠️
很多团队"为了显得高大上"选 Redis,但如果只是做简单缓存,Memcached 更轻量、更稳定。选择合适的,而不是选择流行的。
九、面试官追问 🔴
面试官:"Redis 单线程为什么比 Memcached 多线程快?"
标准回答:
- Memcached 多线程需要锁竞争,开销大
- Redis 单线程避免了锁竞争,用 IO 多路复用(epoll)
- Redis 6.0 后也引入多线程 IO,但执行还是单线程
面试官追问:"Redis 和 Memcached 混用可以吗?"
标准回答:可以,但会增加复杂度。典型做法是:
- 简单数据用 Memcached(纯 GET/SET)
- 复杂数据用 Redis(需要数据结构)
- 注意数据一致性
面试官追问:"缓存雪崩怎么解决?"
标准回答:
- Redis + Memcached:都可能出现雪崩
- 解决思路:过期时间加随机值、热点数据永不过期、限流降级
十、总结
记住:缓存不是银弹,合适的才是最好的。