Memcached 使用大全
目录
简介
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
ENDadd - 添加数据(仅当 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>
ENDgets - 获取带 CAS 值的键
gets <key> [<key> ...]响应格式:
VALUE <key> <flags> <bytes> <cas_unique>
<value>
ENDtouch - 更新过期时间
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 - 获取版本
versionnoop - 空操作
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_crawlerSlab 管理
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 -vSASL 协议命令
| 命令 | 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/keyTLS 配置选项
| 选项 | 默认值 | 说明 |
|---|---|---|
-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_sizesLRU 优化
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 官方文档整理,最后更新时间:2026 年
