Skip to content

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_flushflush_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 Mechanisms0x20列出支持的认证机制
Start Authentication0x21开始认证
Authentication Step0x22认证后续步骤

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 官方文档整理,最后更新时间:2026 年

更新于:

note