---
url: /redis/memcached.md
---
# Memcached 使用大全

## 目录

1. [简介](#简介)
2. [安装与编译](#安装与编译)
3. [启动参数配置](#启动参数配置)
4. [基本命令协议](#基本命令协议)
5. [高级功能](#高级功能)
6. [客户端连接示例](#客户端连接示例)
7. [监控与维护](#监控与维护)
8. [安全配置](#安全配置)
9. [性能优化](#性能优化)
10. [最佳实践](#最佳实践)

***

## 简介

Memcached 是一个高性能的分布式内存对象缓存系统，用于动态 Web 应用程序以减轻数据库负载。

### 核心特性

* **多进程/多线程架构**：支持 listen 线程、worker 线程、LRU 维护器、LRU 爬虫等
* **内存分配**：使用 slab allocator 管理内存
* **数据淘汰**：LRU（最近最少使用）算法
* **协议支持**：ASCII 文本协议和二进制协议

### 核心架构

```
               THREADS            +            STRUCTURES
 +----------------------+         |
 |-----------|          |         |     +----------+
+------+  +--v-----+ +--v-----+   |     |hash table|
|listen|  |worker 1| |worker 2|   |     +----------+
+------+  +--------+ +--------+   |
                        +--------->     +---+
                                  |     |LRU|
+--------------+                  |     +---+
|lru maintainer+------------------>
+--------------+                  |     +--------------+
                                  |     |slab allocator|
+-----------+                     |     +--------------+
|lru crawler+--------------------->
+-----------+                     |
                                  |
+---------------+                 |
|slab page mover+----------------->
+---------------+                 |
```

***

## 安装与编译

### 从源码编译安装

```bash
wget https://memcached.org/latest
tar -zxf memcached-x.x.x.tar.gz
cd memcached-x.x.x
./configure --prefix=/usr/local/memcached
make && make test && sudo make install
```

### 查看帮助信息

```bash
./memcached --help
```

***

## 启动参数配置

### 常用启动参数

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `-m <bytes>` | 内存限制（MB） | 64MB |
| `-c <num>` | 最大连接数 | 1024 |
| `-p <port>` | TCP 监听端口 | 11211 |
| `-U <port>` | UDP 监听端口 | 11211（1.5.6+ 默认关闭） |
| `-t <num>` | 工作线程数 | 4 |
| `-d` | 后台运行（daemon） | 否 |
| `-u <user>` | 运行用户 | 当前用户 |
| `-e` | 设置 setuid/setgid | 无 |
| `-l <ip>` | 绑定接口/IP | 所有接口 |
| `-s <path>` | Unix domain socket 路径 | 禁用 |
| `-r` | 提升权限（大页内存） | 无 |

### 现代推荐启动选项

```bash
memcached -o slab_reassign,slab_automove,lru_crawler,lru_maintainer,maxconns_fast,hash_algorithm=murmur3
```

### 完整启动示例

```bash
memcached -m 512 -c 2048 -p 11211 -u memcache -d \
  -o slab_reassign,slab_automove,lru_crawler,lru_maintainer \
  -o hash_algorithm=murmur3 \
  -o idle_timeout=60 \
  -o modern
```

### 网络配置参数

```bash
# 绑定特定 IP
-l 127.0.0.1

# 更改 TCP 端口
-p 11211

# 禁用 UDP
-U 0

# 使用 Unix domain socket（禁用 TCP/UDP）
-s /var/run/memcached.sock
```

***

## 基本命令协议

### ASCII 文本协议

#### 存储命令

##### set - 存储数据（覆盖已存在的数据）

```
set <key> <flags> <expiration> <bytes> [noreply]
<value>
```

**示例：**

```
set mykey 0 3600 5
hello
STORED

get mykey
VALUE mykey 0 5
hello
END
```

##### add - 添加数据（仅当 key 不存在时）

```
add <key> <flags> <expiration> <bytes> [noreply]
<value>
```

**响应：** `STORED`（成功）或 `NOT_STORED`（key 已存在）

##### replace - 替换数据（仅当 key 存在时）

```
replace <key> <flags> <expiration> <bytes> [noreply]
<value>
```

**响应：** `STORED`（成功）或 `NOT_STORED`（key 不存在）

##### append - 追加到现有值末尾

```
append <key> <bytes> [noreply]
<value>
```

##### prepend - 添加到现有值开头

```
prepend <key> <bytes> [noreply]
<value>
```

#### 获取命令

##### get - 获取单个或多个键

```
get <key> [<key> ...]
```

**响应格式：**

```
VALUE <key> <flags> <bytes>
<value>
END
```

##### gets - 获取带 CAS 值的键

```
gets <key> [<key> ...]
```

**响应格式：**

```
VALUE <key> <flags> <bytes> <cas_unique>
<value>
END
```

##### touch - 更新过期时间

```
touch <key> <expiration> [flags <new_flags>] [noreply]
```

#### 删除命令

##### delete - 删除键

```
delete <key> [noreply]
```

**响应：** `DELETED`（成功）或 `NOT_FOUND`

#### 计数器命令

##### incr - 递增

```
incr <key> <delta> [noreply]
```

##### decr - 递减

```
decr <key> <delta> [noreply]
```

**注意：** delta 必须为正整数；decr 结果不会低于 0

#### 其他命令

##### flush_all - 清空所有数据

```
flush_all [delay_in_seconds] [noreply]
```

##### stats - 显示统计信息

```
stats [stat_type] [arg]
```

常见类型：

* `stats` - 基本统计
* `stats settings` - 服务器配置
* `stats items` - slab/item 统计
* `stats slabs` - slab 详细信息
* `stats sizes` - item 大小分布

##### version - 获取版本

```
version
```

##### noop - 空操作

```
noop
```

#### 元协议（Meta Protocol）

更高效的协议格式：

```
# Set 请求
ms foo 2 T90 F1\r\n
hi\r\n
# 响应
HD\r\n

# Get 请求
mg foo t f v\r\n
# 响应
VA 2 t78 f1\r\n
hi\r\n

# Delete 请求
md foo\r\n
# 响应
HD\r\n
```

***

## 高级功能

### 物品结构

Memcached 物品包含以下组件：

* **Key**: 任意字符串（最多 250 字节，ASCII 协议不能包含空格/换行）
* **Flags**: 32 位值，由客户端定义
* **Expiration**: 过期时间（0=永不过期，最多 30 天，之后为 Unix 时间戳）
* **CAS Value**: 64 位唯一标识符（可选）
* **Data**: 任意数据

### LRU 算法配置

Memcached 支持多级 LRU（HOT/WARM/COLD）：

```bash
# 配置 HOT 和 WARM LRU 百分比（默认各 32%）
-o hot_lru_pct=20,warm_lru_pct=40

# 启用 LRU 维护器和爬虫
-o lru_maintainer,lru_crawler
```

### Slab 管理

```bash
# 启用 slab 重新分配
-o slab_reassign

# 自动移动 slab（需要先启用 slab_reassign）
-o slab_automove

# 手动指定 slab class 大小
-o slab_sizes=100-200-300-400-500

# 启用 slab rebalancer（动态内存释放）
-o modern
```

### 动态内存调整

```bash
# 运行时调整内存限制
cache_memlimit <bytes> [return_to_os]

# 启用 item 大小追踪
stats sizes_enable
stats sizes_disable

# 查看 item 大小分布
stats sizes
```

### 哈希算法

```bash
# 使用 Murmur3（推荐）
-o hash_algorithm=murmur3
```

***

## 客户端连接示例

### PHP

```php
// 初始化客户端
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer($server);
}

// 缓存模式：先查缓存，miss 则查数据库
$huge_data_for_front_page = $memcache->get("huge_data_for_front_page");
if($huge_data_for_front_page === false){
    $huge_data_for_front_page = array();
    $sql = "SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000";
    $res = mysql_query($sql, $mysql_connection);
    while($rec = mysql_fetch_assoc($res)){
        $huge_data_for_front_page[] = $rec;
    }
    // 缓存 10 分钟
    $memcache->set("huge_data_for_front_page", $huge_data_for_front_page, 0, 600);
}
```

### Perl

```perl
my $memclient = Cache::Memcached->new({
    servers => [ '10.0.0.10:11211', '10.0.0.11:11211' ]
});
```

### Python (伪代码)

```python
memcli = new Memcache()
memcli.add_server('10.0.0.10:11211')
```

### Java

推荐使用 **spymemcached**：支持文本和二进制协议，IPv4/IPv6，测试完善。

### C/C++

推荐使用 **libmemcached**：基础库，支持多种语言的客户端。

***

## 监控与维护

### 查看运行配置

```bash
echo "stats settings" | nc localhost 11211
```

**输出示例：**

```
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT evictions on
STAT num_threads 4
STAT cas_enabled yes
END
```

### 关键统计指标

```bash
stats
```

| 指标 | 说明 | 监控建议 |
|------|------|----------|
| `curr_connections` | 当前连接数 | 不应接近 `-c` 限制 |
| `listen_disabled_num` | 达到最大连接次数 | 应接近 0 |
| `accepting_conns` | 是否接受连接（0/1） | 应为 1 |
| `limit_maxbytes` | 配置的内存上限 | 验证是否符合预期 |
| `cmd_flush` | flush_all 执行次数 | 仅在有意清空时增加 |
| `evictions` | 全局淘汰物品数 | 过高表示内存不足 |
| `get_hits` | 缓存命中次数 | - |
| `get_misses` | 缓存未命中次数 | 计算命中率 |

### 查看 Slab 统计

```bash
stats items
```

**关键字段：**

* `evicted`: 被淘汰的物品总数
* `evicted_nonzero`: 有非无限过期时间的淘汰物品数
* `evicted_time`: 自上次淘汰以来的秒数（小值表示内存压力大）

***

## 安全配置

### SASL 认证

#### 配置文件

```bash
# 创建 SASL 配置文件
echo "mech_list: plain" > memcached.conf

# 创建密码数据库
echo "myname:mypass" > /tmp/memcached-sasl-db

# 设置环境变量并启动
export MEMCACHED_SASL_PWDB=/tmp/memcached-sasl-db
export SASL_CONF_PATH=`pwd`/memcached.conf
./memcached -S -v
```

#### SASL 协议命令

| 命令 | Op Code | 说明 |
|------|---------|------|
| List Mechanisms | 0x20 | 列出支持的认证机制 |
| Start Authentication | 0x21 | 开始认证 |
| Authentication Step | 0x22 | 认证后续步骤 |

### TLS/SSL 加密

#### 启动带 TLS 的服务

```bash
memcached -Z -o ssl_chain_cert=/home/user/cert,ssl_key=/home/user/key
```

#### TLS 配置选项

| 选项 | 默认值 | 说明 |
|------|--------|------|
| `-o ssl_keyformat=` | 1 (PEM) | 私钥格式 |
| `-o ssl_verify_mode=` | 0 (None) | 证书验证模式（0/1/2/3） |
| `-o ssl_ciphers=` | - | 限制支持的加密套件 |
| `-o ssl_ca_cert=` | - | CA 证书文件（仅 PEM） |

### 网络安全建议

```bash
# 绑定到内网接口
-l 127.0.0.1

# 使用 Unix domain socket（最安全）
-s /var/run/memcached.sock

# 禁用 UDP（防止 DNS 放大攻击）
-U 0
```

**重要提示：** Memcached 不设计用于直接暴露到互联网；即使使用 SASL 认证也不完全可信。

***

## 性能优化

### 内存配置

```bash
# 分配足够内存，避免频繁淘汰
-m 4096  # 4GB

# 启用大页内存
-r
```

### 线程数调优

```bash
# 根据 CPU 核心数设置
-t 8  # 8 个 worker 线程
```

### Slab 优化

```bash
# 启用所有现代优化选项
-o slab_reassign,slab_automove,lru_crawler,lru_maintainer

# 启用现代模式（包括 slab rebalancer）
-o modern

# 追踪 item 大小
-o track_sizes
```

### LRU 优化

```bash
# 启用 LRU 维护
-o lru_maintainer,lru_crawler

# 调整 HOT/WARM 比例
-o hot_lru_pct=20,warm_lru_pct=40,cold_lru_pct=40
```

### 连接优化

```bash
# 快速处理连接
-o maxconns_fast

# 空闲连接超时
-o idle_timeout=60
```

***

## 最佳实践

### 1. Key 设计规范

* 保持简短（< 250 字节）
* 避免特殊字符（ASCII 协议）
* 使用一致的前缀命名空间
* 包含业务含义便于调试

### 2. 过期时间策略

* 设置合理的 TTL，避免永不过期
* 对热点数据使用较短 TTL
* 考虑添加随机因子避免集体过期

### 3. 缓存模式

```
Cache-Aside Pattern（推荐）：
1. 先从缓存读取
2. miss 则从数据库读取
3. 写入缓存
4. 返回数据
```

### 4. 监控告警

* 监控缓存命中率（get_hits / (get_hits + get_misses)）
* 监控 evictions 数量
* 监控连接数
* 监控内存使用率

### 5. 生产环境配置模板

```bash
#!/bin/bash
# memcached 生产环境启动脚本

MEMCACHED_OPTS="
    -m 8192                    # 8GB 内存
    -c 4096                    # 4096 连接
    -p 11211                   # 端口
    -U 0                       # 禁用 UDP
    -t 16                      # 16 线程
    -u memcache                # 运行用户
    -d                         # 后台运行
    -l 127.0.0.1               # 仅本地访问
    -o modern                  # 启用现代特性
    -o slab_reassign           # slab 重分配
    -o slab_automove           # 自动移动 slab
    -o lru_crawler             # LRU 爬虫
    -o lru_maintainer          # LRU 维护器
    -o hash_algorithm=murmur3  # Murmur3 哈希
    -o idle_timeout=60         # 空闲超时 60 秒
    -o track_sizes             # 追踪 item 大小
"

exec /usr/local/memcached/bin/memcached $MEMCACHED_OPTS
```

***

## 参考资料

* [Memcached 官方文档](https://memcached.org/)
* [Binary Protocol Specification](http://cloud.github.com/downloads/memcached/memcached/protocol-binary.txt)
* [libmemcached](http://tangent.org/552/libmemcached.html)
* [spymemcached](http://code.google.com/p/spymemcached/)

***

*本文档基于 Memcached 官方文档整理，最后更新时间：2026 年*
