1. 概述

本文将深入对比两种广泛使用的内存数据库:MemcachedRedis。作为后端开发,我们经常在性能优化中引入缓存机制,而这两者是绕不开的技术选型。通过本文,你会清晰掌握它们各自的适用场景和核心差异,避免在项目中“踩坑”。

2. Memcached 与 Redis 简介

缓存是提升系统性能的常用手段,尤其在高并发、大数据量场景下效果显著。

  • Memcached 是一个轻量级、分布式的内存缓存系统,设计上追求简单高效,✅非常适合用作缓存或会话存储(session store)。
  • Redis 是一个功能丰富的内存数据结构存储系统,不仅能做缓存,还能充当数据库、消息中间件甚至任务队列,✅适用场景更广。

简单粗暴地说:
如果你只需要一个“键值缓存”,Memcached 足够;
但如果你需要更多数据结构、持久化、发布订阅等能力,Redis 是更优选择。

3. 安装方式

3.1 安装 Memcached

你可以通过源码编译安装最新版 Memcached:

$ wget http://memcached.org/latest
$ tar -zxvf memcached-1.6.3.tar.gz
$ cd memcached-1.6.3
$ ./configure && make && make test && sudo make install

安装完成后,启动服务:

$ memcached -d -m 64 -p 11211 -u nobody -l 127.0.0.1

3.2 安装 Redis

Redis 同样支持源码安装:

$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz
$ tar xzf redis-5.0.8.tar.gz
$ cd redis-5.0.8
$ make

编译完成后,启动 Redis 服务:

$ src/redis-server

你也可以使用 src/redis-cli 连接本地实例进行测试。

4. 相似之处

尽管定位不同,两者在核心能力上有很多共通点:

4.1 微秒级延迟 ✅

两者都将数据存储在内存中,读写延迟通常在 亚毫秒级别,非常适合高性能缓存场景。

4.2 数据分片支持 ✅

都支持通过客户端实现数据分片(sharding),将数据分布到多个节点,提升存储容量和并发能力。

4.3 多语言支持 ✅

主流编程语言均有成熟客户端支持,包括 Java、Python、JavaScript、C、Ruby 等。

Java 生态中常见客户端如下:

数据库 常用 Java 客户端
Memcached Xmemcached, Memcached-java-client
Redis Jedis, Lettuce, Redisson

推荐:生产环境优先考虑 Lettuce(支持响应式编程)或 Redisson(功能丰富,API 友好)。

4.4 缓存清空能力 ✅

  • Memcached 使用 flush_all 命令清空所有缓存。
  • Redis 提供 FLUSHDB(清空当前库)和 FLUSHALL(清空所有库)命令。

⚠️ 注意:这些命令在生产环境慎用!

4.5 高可扩展性 ✅

两者都能通过横向扩展应对数据量和请求量的增长,适合大规模应用。

5. 核心差异

这才是本文重点。以下差异决定了你在技术选型时的最终决策。

5.1 命令行工具差异

Memcached 没有专用 CLI,只能通过 telnet 连接并发送原始协议命令:

$ telnet 10.2.3.4 5678
Trying 10.2.3.4...
Connected to 10.2.3.4.

执行统计命令:

$ stats
STAT pid 14868
STAT uptime 175931
STAT time 1220540125
// ...

而 Redis 提供了专用的 redis-cli 工具,功能强大且交互友好:

$ redis-cli COMMAND
1) 1) "save"
     2) (integer) 1
     3) 1) "admin"
        2) "noscript"
     // ...
2) 1) "multi"
   2) (integer) 1
   3) 1) "noscript"
      2) "fast"
   // ...
3) 1) "geodist"
   2) (integer) -4
   3) 1) "readonly"
   // ...

COMMAND 命令可列出 Redis 支持的所有命令,调试和学习非常方便。

5.2 持久化能力

  • ❌ Memcached 本身不支持持久化,需依赖第三方工具(如 libmemcached-tools)或分支(如 memcached-dd)。
  • ✅ Redis 原生支持两种持久化机制:
    • RDB:定时快照(dump.rdb)
    • AOF:追加日志,数据更安全

常用命令示例:

$ redis-cli SAVE
OK

同步保存快照,会阻塞主线程,生产慎用。

$ redis-cli BGSAVE
OK

后台异步保存,推荐使用。

$ redis-cli LASTSAVE
(integer) 1410853592

返回上次成功保存的 Unix 时间戳。

5.3 支持的数据结构

这是最直观的差异:

特性 Memcached Redis
数据类型 仅支持字符串(String) 支持 String、List、Set、Hash、ZSet、Bitmap、Geo 等
单 value 大小 最大 1MB 最大 512MB

✅ Redis 的数据结构优势明显,比如:

  • List 实现消息队列
  • Set 做去重统计
  • Hash 存储对象字段
  • ZSet 做排行榜

5.4 主从复制

  • ❌ Memcached 无原生复制支持,依赖第三方 fork(如 repcached)。
  • ✅ Redis 原生支持主从复制,提升可用性和读性能。

配置从节点:

$ redis-cli REPLICAOF <master-ip> <master-port>

Redis 5 之前使用 SLAVEOF,之后统一为 REPLICAOF

同步过程由 PSYNC 命令驱动,支持全量和增量复制。

5.5 事务支持

  • ❌ Memcached 不支持事务,虽然单个操作是原子的。
  • ✅ Redis 提供基础事务支持,通过以下命令实现:
MULTI          # 开启事务
SET key value
INCR counter
EXEC           # 执行事务

还可配合 WATCH 实现乐观锁:

WATCH key
# 检查 key 是否被修改,若被修改则事务不执行

⚠️ 注意:Redis 事务不支持回滚(rollback),出错时已执行的命令不会撤销。

5.6 发布/订阅(Pub/Sub)

  • ❌ Memcached 不支持消息通信。
  • ✅ Redis 原生支持发布订阅模式,适用于:
    • 实时聊天
    • 动态推送
    • 服务间通知

核心命令:

# 订阅频道
$ redis-cli SUBSCRIBE news

# 发布消息
$ redis-cli PUBLISH news "Hello World"

# 取消订阅
$ redis-cli UNSUBSCRIBE news

在 Java 中可通过 Jedis 或 Lettuce 轻松集成。

5.7 地理空间(Geo)支持

  • ❌ Memcached 无此能力。
  • ✅ Redis 提供专门的 Geo 命令,适合 LBS 应用。

常用命令:

# 添加地理位置
GEOADD cities 116.405285 39.904989 "Beijing"

# 计算两点距离
GEODIST cities Beijing Shanghai km

# 查询某点半径内城市
GEORADIUS cities 116.405285 39.904989 500 km

配合 Spring Data Redis 可在 Java 项目中快速实现地理功能。

5.8 架构设计

特性 Memcached Redis
线程模型 多线程,利用多核 CPU 单线程(主线程)
小数据性能 一般 更高(无锁竞争)
大数据吞吐 更好(多线程并发处理) 受限于单线程
扩展方式 多进程 + 客户端分片 原生集群(Redis Cluster)

⚠️ Redis 虽然是单线程,但 I/O 多路复用使其在大多数场景下性能优异。只有在大 value 或高并发写入时,Memcached 的多线程优势才可能体现。

Redis 集群配置较复杂,推荐使用 Lettuce 或 Redisson 简化客户端接入。

5.9 Lua 脚本支持

  • ❌ Memcached 不支持脚本。
  • ✅ Redis 支持 Lua 脚本,实现原子性复杂操作。

示例:通过 Lua 设置值

$ redis-cli eval "return redis.call('set',KEYS[1],'baeldung')" 1 website
OK

脚本在 Redis 中原子执行,避免多次网络往返。

5.10 内存使用效率

  • ✅ 存储字符串时,Memcached 内存利用率更高
  • ✅ 但 Redis 使用 Hash 结构时(尤其是小字段对象),通过共享键和压缩编码,内存效率反而可能优于 Memcached。

例如,用 Hash 存储用户信息:

HSET user:1001 name "Alice" age 25 city "Beijing"

Redis 会对小整数和短字符串做特殊编码,节省内存。

6. 总结

维度 推荐选择 原因
简单缓存 Memcached 轻量、高效、资源占用少
复杂场景 Redis 功能全面,支持持久化、事务、消息等
高并发写入 Memcached 多线程优势
数据结构需求 Redis List、Set、Hash 等开箱即用
消息通信 Redis 原生 Pub/Sub
地理位置服务 Redis Geo 命令支持

最终建议

  • 如果你的需求只是“缓存 HTML 片段”或“Session 存储”,Memcached 简单直接。
  • 但绝大多数现代应用(尤其是微服务架构)中,Redis 是更通用、更强大的选择,即使只用作缓存,其生态和扩展能力也远超 Memcached。

技术选型没有银弹,但 Redis 的综合能力让它在多数场景下胜出。记住:不要为了用 Redis 而用,但也不要因为“它比 Memcached 重”就拒绝它——很多时候,多出来的功能恰恰是业务需要的。


原始标题:Memcached vs Redis | Baeldung