一、核心差异概述
特性 | Memcached | Redis |
---|---|---|
数据结构 | 简单键值存储 | 丰富数据结构(String/Hash/List/Set等) |
持久化 | 不支持 | 支持RDB和AOF两种方式 |
线程模型 | 多线程 | 单线程(6.0+支持多线程I/O) |
内存管理 | Slab分配+LRU淘汰 | 多种淘汰策略(LRU/LFU等) |
集群支持 | 客户端分片 | 原生Cluster集群支持 |
事务支持 | 不支持 | 支持简单事务(MULTI/EXEC) |
发布订阅 | 不支持 | 支持 |
Lua脚本 | 不支持 | 支持 |
地理空间索引 | 不支持 | 支持(GEO) |
二、详细对比分析
1. 性能表现
Memcached优势:
- 纯内存操作,读写性能极高(10万+ QPS)
- 多线程模型充分利用多核CPU
- 更简单的协议带来更低的延迟
Redis优势:
- 单线程避免锁竞争,在复杂操作时更稳定
- Pipeline批量操作大幅提升吞吐量
- 6.0+版本的多线程I/O提升网络性能
基准测试数据(相同硬件条件下):
- SET操作:Memcached快5-10%
- GET操作:Memcached快5%左右
- 复杂操作(如ZRANGE):Redis优势明显
2. 内存效率
Memcached特点:
- Slab内存分配减少碎片
- 更紧凑的内存使用(无额外数据结构开销)
- 固定大小内存池,不会出现OOM
Redis特点:
- 多种编码优化(ziplist/intset等)
- 可配置的内存淘汰策略
- 内存碎片整理(4.0+版本)
内存使用示例 :
存储100万个简单键值(key:16字节,value:100字节)
- Memcached:约120MB
- Redis:约135MB(含数据结构开销)
3. 数据持久化
Memcached:
- 纯内存存储,重启后数据丢失
- 适合完全可重建的缓存数据
Redis:
-
RDB:定时快照,适合备份和灾难恢复
redis.conf配置示例
save 900 1 # 15分钟内至少1个key变化
save 300 10 # 5分钟内至少10个key变化 -
AOF:记录所有写操作,数据安全性更高
appendonly yes
appendfsync everysec # 每秒同步 -
混合持久化(4.0+):结合两者优势
4. 集群与扩展
Memcached集群:
- 客户端分片(如一致性哈希)
- 无主从复制,节点故障时数据丢失
- 扩容时需要数据迁移
Redis集群方案:
-
主从复制:读写分离,数据冗余
从节点配置
replicaof 192.168.1.100 6379
-
哨兵模式:自动故障转移
sentinel monitor mymaster 127.0.0.1 6379 2
-
Cluster模式:数据分片(16384个slot)
redis-cli --cluster create 127.0.0.1:7000... --cluster-replicas 1
5. 高级功能对比
Redis特有功能:
-
发布订阅:消息通知系统
PUBLISH channel "message"
SUBSCRIBE channel -
Lua脚本:原子性复杂操作
-- 限流脚本示例
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = tonumber(redis.call('get', key) or "0")
if current + 1 > limit then
return 0
else
redis.call('INCR', key)
redis.call('EXPIRE', key, 1)
return 1
end -
Stream:消息队列功能
-
GEO:地理位置计算
Memcached优势场景:
- 超大规模简单键值缓存
- 需要多线程高并发的纯缓存场景
- 对持久化无要求的临时数据存储
三、优劣势总结
Memcached优势
- 更简单的设计带来更高性能
- 多线程模型充分利用多核CPU
- 内存管理更高效(Slab分配)
- 大规模部署时更稳定
Redis优势
- 丰富的数据结构满足复杂需求
- 持久化保证数据安全
- 集群方案更完善(原生Cluster)
- 更多高级功能(事务/发布订阅等)
共同劣势
- 内存限制(数据量受RAM大小制约)
- 缓存雪崩/穿透等通用问题
- 分布式一致性问题
四、适用场景推荐
推荐使用Memcached的场景
- 简单键值缓存:HTML片段缓存、API响应缓存
- 会话存储:不需要持久化的用户会话
- 高并发临时数据:秒杀库存计数器
- 大规模部署:需要数千节点的缓存层
典型架构示例:
[Web Server] → [Memcached集群] → [Database]
推荐使用Redis的场景
- 复杂数据结构:排行榜(SortedSet)、社交关系(Set)
- 需要持久化的缓存:用户配置信息
- 消息系统:发布订阅、Stream消息队列
- 实时系统:实时排行榜、地理位置服务
- 分布式锁:跨进程资源协调
典型架构示例:
[App Server] → [Redis Cluster]
→ [Redis Sentinel]
→ [Database]
混合使用场景
在实际生产环境中,可以结合两者优势:
-
前端缓存层:Memcached处理简单键值
-
业务逻辑层:Redis处理复杂数据结构和业务逻辑
[客户端] → [Memcached] → [Redis] → [数据库]
(简单缓存) (业务逻辑)
五、迁移与选型建议
从Memcached迁移到Redis
-
渐进式迁移:
- 新功能使用Redis
- 旧数据逐步迁移
- 双写策略保证一致性
-
数据结构转换:
伪代码示例
def migrate_key(key):
value = memcached.get(key)
if is_simple_value(value):
redis.set(key, value)
elif is_list_value(value):
redis.rpush(key, *value)
# 其他类型转换... -
客户端适配 :
- 使用支持双协议的客户端(如Twemproxy)
- 逐步更新应用代码
选型决策树

六、性能调优对比
Memcached调优重点
-
Slab配置优化:
启动参数示例
memcached -m 4096 -f 1.2 -n 128 -t 8
-f
:增长因子(默认1.25)-n
:初始chunk大小
-
LRU调优:
禁用LRU(内存满时返回错误)
-M
-
连接池优化 :
- 每个线程维护独立连接
- 避免连接数过多导致性能下降
Redis调优重点
-
内存优化:
redis.conf关键配置
hash-max-ziplist-entries 512
list-max-ziplist-size 64
activerehashing yes -
持久化调优:
根据业务需求选择
save 900 1 # RDB配置
appendfsync everysec # AOF配置 -
网络优化 :
- Pipeline批量操作
- 避免大Value(>1MB)
- 合理配置TCP参数
七、监控指标对比
Memcached关键指标
指标 | 说明 | 健康值参考 |
---|---|---|
curr_items | 当前存储的item数量 | 根据内存容量 |
bytes | 已用内存大小 | < 80%最大内存 |
get_hits | 缓存命中数 | 越高越好 |
get_misses | 缓存未命中数 | 越低越好 |
evictions | LRU淘汰的item数 | 接近0 |
Redis关键指标
指标 | 说明 | 健康值参考 |
---|---|---|
used_memory | 已用内存 | < 80% maxmemory |
mem_fragmentation_ratio | 内存碎片率 | 1.0-1.5 |
instantaneous_ops_per_sec | 每秒操作数 | 根据业务特点 |
keyspace_hits | 缓存命中数 | 越高越好 |
keyspace_misses | 缓存未命中数 | 越低越好 |
connected_clients | 客户端连接数 | < 10000 |
八、未来发展趋势
Memcached
- 保持简单稳定的设计哲学
- 小规模性能优化
- 云原生支持(如K8s部署)
Redis
- Redis 7.0+方向 :
- 更好的集群管理
- 更完善的多线程支持
- 存储引擎优化(如Disque模块)
- 云服务集成 :
- 各大云平台的托管Redis服务
- 与Serverless架构结合
九、经典案例参考
Memcached典型应用
- Wikipedia:用于页面缓存
- Facebook:早期大规模使用(后部分迁移到Redis)
- YouTube:视频元数据缓存
Redis典型应用
- Twitter:时间线、社交图谱
- GitHub:仓库统计、任务队列
- StackOverflow:问题投票、标签系统
总结建议
- 简单至上原则:如果只需要简单键值缓存,优先考虑Memcached
- 功能需求导向:需要高级功能时选择Redis
- 混合架构:大型系统可同时使用两者,各取所长
- 性能测试:关键业务场景务必进行基准测试
- 监控先行:无论选择哪种方案,完善的监控必不可少
最终选择应基于:业务需求、团队熟悉度、长期维护成本等因素综合评估。