# Redis 和 Memcached 有哪些区别?
8 min read
Table of Contents
Redis 和 Memcached 有哪些区别?
Redis 与 Memcached 的区别
【核心定义】
Redis 是一个支持多种数据结构、具备持久化能力、支持主从复制和事务的内存键值数据库;Memcached 是一个专注于高性能、分布式缓存的纯内存键值缓存系统。
【关键要点】
-
数据结构差异
- Redis:支持 String、List、Hash、Set、Sorted Set、Bitmaps、HyperLogLogs、Streams 等丰富数据结构,可满足复杂业务场景。
- Memcached:仅支持简单的 String 类型键值对,所有值都是字符串或二进制数据。
-
数据持久化
- Redis:提供 RDB(快照)和 AOF(追加日志)两种持久化机制,可保证数据在重启后不丢失。
- Memcached:不支持任何持久化,重启后数据全部丢失,定位为纯缓存。
-
内存管理机制
- Redis:采用自己实现的 zmalloc 进行内存分配,支持多种内存淘汰策略(LRU、LFU、随机等),可通过 maxmemory 限制内存使用。
- Memcached:使用 Slab Allocation 机制管理内存,将内存分割成不同大小的 chunk,减少内存碎片,但可能造成一定程度的内存浪费。
-
线程模型与性能
- Redis:6.0 之前是单线程模型(网络 I/O 和数据操作),避免了锁竞争,保证原子性;6.0 后引入多线程 I/O(但仍保持核心操作单线程)。
- Memcached:多线程模型(主线程 + 工作线程),利用多核优势,在高并发读取场景下性能表现优异。
-
集群与分布式
- Redis:原生支持 Redis Cluster 分片集群(16384 个槽),支持主从复制、哨兵模式,客户端可直连集群。
- Memcached:本身不支持集群,依赖客户端一致性哈希进行分布式部署,集群功能较弱。
-
附加功能
- Redis:支持发布订阅、Lua 脚本、事务、管道、慢查询日志、客户端缓存等高级功能。
- Memcached:功能单一,专注于缓存,没有额外的高级特性。
【深度推导/细节】
内存管理机制对比
-
Redis 的淘汰策略:
- 当内存达到 maxmemory 时,Redis 提供 8 种淘汰策略(如 volatile-lru、allkeys-lfu 等),可根据业务特点选择。
- LRU 算法优化:Redis 采用近似 LRU,通过随机采样(默认 5 个 key)选择最久未使用的 key 淘汰,在保证性能的同时接近真实 LRU 效果。
-
Memcached 的 Slab 分配:
- 将内存划分为多个 Slab Class,每个 Class 包含相同大小的 Chunk。
- 优点:减少内存碎片,提高内存分配效率。
- 缺点:可能因 Chunk 大小固定导致内存浪费(如 100 字节数据存入 128 字节 Chunk,浪费 28 字节)。
线程模型对性能的影响
-
Redis 单线程的优势:
- 避免多线程上下文切换和锁竞争,在单核上性能极高。
- 所有操作原子性执行,无需额外同步。
- 瓶颈通常在于网络 I/O 而非 CPU,6.0 后多线程 I/O 可进一步提升网络处理能力。
-
Memcached 多线程的优势:
- 可充分利用多核 CPU,特别适合读多写少的高并发场景。
- 通过锁粒度优化(分段锁)减少竞争,但复杂操作仍需全局锁。
【关联/对比】
与数据库缓存场景的适配
- Redis:适合需要复杂数据结构、持久化保证、数据一致性要求高的场景,如会话存储、排行榜、消息队列、实时分析等。
- Memcached:适合简单的键值缓存、数据可丢失、追求极致读取性能的场景,如 HTML 片段缓存、数据库查询结果缓存。
性能关键数字
- Redis 单线程 QPS:通常可达 8-10 万/秒(取决于命令复杂度和数据大小)。
- Memcached 多线程 QPS:在多核服务器上可达 50 万+/秒(针对简单 GET 操作)。
- 内存利用率:Memcached 的 Slab 分配可能导致 10-30% 的内存浪费,而 Redis 的内存利用率更高。
『面试官追问』
-
为什么 Redis 6.0 要引入多线程?单线程不够用吗?
- Redis 的瓶颈通常在于网络 I/O 而非 CPU。6.0 引入多线程仅用于处理网络读写和协议解析,核心的数据操作仍保持单线程,既提升了网络吞吐量,又保持了操作原子性。
-
Memcached 的一致性哈希是如何工作的?
- 客户端维护一个虚拟节点环,将服务器节点映射到环上多个虚拟点。
- 对 key 进行哈希后,在环上顺时针找到第一个虚拟节点,即对应实际服务器。
- 优点:节点增删时仅影响相邻数据,减少数据迁移量。
-
Redis 的持久化如何保证数据安全?
- RDB:定时 fork 子进程生成快照,适合备份和灾难恢复,但可能丢失最后一次快照后的数据。
- AOF:记录每个写操作,可配置每秒同步或每次操作同步,数据安全性更高,但文件体积较大。
- 生产环境通常同时开启 RDB 和 AOF,用 AOF 保证数据完整性,用 RDB 加快重启恢复速度。
-
什么场景下应该选择 Memcached 而不是 Redis?
- 当业务只需要简单键值缓存,且数据可丢失时。
- 当缓存数据量极大(几百GB)且访问模式简单,Memcached 的多线程模型可能提供更高吞吐。
- 当已有成熟的 Memcached 客户端和运维体系,迁移成本过高时。
-
Redis 的内存淘汰策略中,LFU 和 LRU 有什么区别?
- LRU(最近最少使用):淘汰最久未被访问的 key,基于访问时间。
- LFU(最不经常使用):淘汰访问频率最低的 key,基于访问次数。
- Redis 4.0 引入 LFU,通过概率衰减机制避免历史访问影响当前决策,适合热点数据场景。
总结选择建议:
- 需要丰富数据结构、持久化、高级功能 → 选择 Redis。
- 只需要简单缓存、极致读取性能、可接受数据丢失 → 考虑 Memcached。
- 大多数现代应用选择 Redis,因其功能全面且生态完善,Memcached 在特定高性能缓存场景仍有价值。