Redis vs Memcached

面试官问:"Redis 和 Memcached 有什么区别?"

小陈说:"Redis 更强大,Memcached 更简单?"

面试官追问:"那什么时候用 Memcached?"

小陈说:"...好像很少用?"

面试官继续追问:"Memcached 的内存管理是怎么做的?"

小陈答不上来。

Redis vs Memcached 是面试中的经典对比题。这道题能说清楚两者功能差异和选型理由的候选人,对缓存技术选型有实战理解。

一、功能对比 🔴

1.1 核心差异表

特性RedisMemcached
数据结构String/Hash/List/Set/ZSet/Streams 等仅 String
持久化RDB + AOF无(纯内存)
主从复制支持支持(但弱)
集群Cluster集群(支持弱)
内存管理自定义 SDSSlab Allocation
多线程6.0+ 多线程 IO多线程(所以更快?)
Lua 脚本支持不支持
事务MULTI/EXEC不支持
发布订阅支持不支持

1.2 为什么 Redis 胜出?

-- Redis 的优势:
-- 1. 丰富的数据结构,减少序列化/反序列化
--    Memcached 存 Hash → JSON 字符串,解析开销大
-- 2. 持久化保证,断电不丢数据
-- 3. 主从复制和集群支持更好
-- 4. Lua 脚本实现复杂逻辑

1.3 ❌ 错误示范

候选人原话:"Memcached 是多线程的,所以比 Redis 快。"

问题诊断:Redis 6.0 也引入了多线程 IO。Memcached 的多线程是处理网络 IO 的,不是处理命令的。两者在纯内存操作上性能相近。

【面试官心理】 这道题我会从"为什么 Memcached 市场份额被 Redis 超越"追问。能说清楚 Redis 数据结构优势和 Memcached slab 分配缺点的候选人,说明他对缓存技术有系统理解。

二、Memcached 的 Slab Allocation 🟡

2.1 Slab Allocation 原理

// Memcached 的内存管理:
// 预先分配不同大小的内存块(slab)
// slab1: 64B  chunk
// slab2: 128B chunk
// slab3: 256B chunk
// ...
// slab50: 1MB chunk

// 存储时:
// value = 100B → 分配到 128B slab
// value = 200B → 分配到 256B slab

// 问题:
// 如果 value = 130B,分配到 256B,浪费 126B
// 如果 value = 90B,分配到 128B,浪费 38B

2.2 Redis 的内存管理

-- Redis 的内存管理:
-- 按需分配,每次创建 key-value 时分配刚好够的内存
-- SDS 自动扩展,不会浪费

-- 但 Redis 也有内存碎片问题
INFO memory
# mem_fragmentation_ratio: 1.56
# (>1.5 说明碎片严重)

-- 解决:
# 1. 重启 Redis
# 2. MEMORY PURGE(Redis 4.3+

三、选型建议 🟡

3.1 选 Memcached 的场景

-- 适合 Memcached:
-- 1. 纯 String 缓存,数据量非常大
-- 2. 对内存碎片极其敏感(Memcached 碎片率低)
-- 3. 只需要简单的 K-V 缓存
-- 4. 多核服务器,需要多线程并行处理

3.2 选 Redis 的场景

-- 适合 Redis:
-- 1. 需要丰富的数据结构
-- 2. 需要持久化
-- 3. 需要主从复制/集群
-- 4. 需要 Lua 脚本/事务
-- 5. 需要发布订阅
-- 6. 需要高级数据结构(Bitmap、HyperLogLog)

四、性能对比 🟢

4.1 性能数据

-- 理论性能(单实例):
-- Memcached:约 200 万 QPS(多线程)
-- Redis 6.0:约 100 万 QPS(单线程执行,多线程 IO)

-- 但实际性能取决于:
-- 1. Value 大小
-- 2. 数据结构复杂度
-- 3. 网络带宽

4.2 内存效率

-- Memcached:Slab Allocation 有碎片,但内存预分配减少碎片
-- Redis:按需分配,无内碎片,但有外碎片

【面试官心理】 Redis vs Memcached 是面试中的经典题。能说清楚 Slab Allocation 原理和 Redis 数据结构优势的候选人,说明他对缓存技术有深入理解。


级别考察重点期望回答
P5基本区别Redis 数据结构更丰富
P6深度对比Slab Allocation vs 按需分配
P7选型能力根据场景选择 Memcached vs Redis