中 基础
Redis与Memcached对比#
一句话答案#
Redis 支持丰富数据结构 + 持久化 + 集群,功能全面但单线程;Memcached 纯 KV + 多线程,在简单高并发 KV 缓存场景下吞吐略高,但功能单一。绝大多数场景选 Redis。
核心要点
核心对比#
| 维度 | Redis | Memcached |
|---|---|---|
| 数据结构 | String/Hash/List/Set/ZSet/Bitmap/HyperLogLog | 只有 String(KV) |
| 持久化 | RDB + AOF | 不支持(纯内存) |
| 线程模型 | 单线程(6.0 IO 多线程) | 多线程 |
| 集群 | Sentinel + Cluster 原生支持 | 客户端一致性哈希,无原生集群 |
| 内存管理 | 多种淘汰策略(LRU/LFU/TTL) | LRU 淘汰,Slab 分配器 |
| 发布订阅 | 支持 Pub/Sub | 不支持 |
| Lua 脚本 | 支持 | 不支持 |
| 事务 | 支持(MULTI/EXEC) | 不支持 |
| 单 Value 大小 | 512 MB | 1 MB |
什么时候选 Memcached?#
- 纯粹的 KV 缓存:不需要复杂数据结构
- 多核利用:Memcached 天然多线程,不需要多实例
- 内存效率:Slab 分配器在固定大小 KV 场景下内存碎片更少
什么时候选 Redis?#
- 需要丰富数据结构(排行榜用 ZSet、计数用 HyperLogLog)
- 需要持久化(缓存数据不能全丢)
- 需要原生集群和高可用
- 需要 Lua 脚本做原子操作
- 需要发布订阅功能
实际决策: 绝大多数场景选 Redis,除非是纯 KV 且极致追求多核性能。
性能对比#
- 简单 KV GET/SET:两者差距不大,Redis 单机 10 万+ QPS
- 复杂操作(ZADD/HGETALL):Memcached 不支持,Redis 独有
- 多核场景:Memcached 单实例利用多核,Redis 需要多实例
面试回答(2分钟版)
Redis 和 Memcached 都是内存缓存,但定位不同。Redis 支持丰富的数据结构如 String、Hash、List、Set、ZSet,还有持久化、原生集群、Lua 脚本和发布订阅等功能;Memcached 只支持简单的 KV 存储,不支持持久化也没有原生集群。线程模型上 Redis 是单线程执行命令(6.0 开始 IO 层支持多线程),Memcached 天然多线程可以利用多核。性能方面简单 KV 操作两者差距不大,Redis 单机 10 万+ QPS,但涉及排行榜、计数器、分布式锁等场景只有 Redis 能做。Memcached 的优势在于多核场景下单实例吞吐略高,以及 Slab 分配器在固定大小 KV 场景下内存碎片更少。实际选型一句话:绝大多数场景选 Redis,除非业务只需纯 KV 缓存且极致追求多核性能才考虑 Memcached。
追问与易错
追问方向:
- “Redis 6.0 的多线程和 Memcached 的多线程一样吗?”→ 不一样,Redis 只在 IO 层多线程,命令执行仍单线程
- “为什么 Redis 单线程还这么快?”→ 内存操作 + epoll + 单线程无锁
易错点:
- ❌ “Memcached 比 Redis 快”——简单 KV 差距不大,Redis 功能丰富得多
- ❌ “Redis 单线程不能利用多核”——可以部署多实例,或用 6.0 IO 多线程