面试知识库
基础

Redis与Memcached对比#

一句话答案#

Redis 支持丰富数据结构 + 持久化 + 集群,功能全面但单线程;Memcached 纯 KV + 多线程,在简单高并发 KV 缓存场景下吞吐略高,但功能单一。绝大多数场景选 Redis。

核心要点

核心对比#

维度RedisMemcached
数据结构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 MB1 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 多线程