Memcached 连接全攻略(2025 版)
下面从 连接方式 → 客户端选择 → 多语言示例 → 连接池 → 集群连接 → 安全加固 → 监控诊断 一步步讲解如何 可靠、高效、安全 地连接 Memcached。
1. 连接基础参数
| 参数 | 说明 | 示例 |
|---|---|---|
| Host | IP 或域名 | 192.168.1.100 |
| Port | 默认端口 | 11211 |
| Timeout | 连接/读写超时 | 2.5 秒 |
| Persistent | 长连接(推荐) | True |
| Binary Protocol | 二进制协议(更快) | 启用 |
推荐:使用 长连接 + 二进制协议
2. 客户端选择(主流语言)
| 语言 | 推荐客户端 | 安装方式 |
|---|---|---|
| Python | pymemcache | pip install pymemcache |
| PHP | Memcached(PECL) | pecl install memcached |
| Java | XMemcached | Maven 依赖 |
| Node.js | memjs | npm install memjs |
| Go | gomemcache | go get github.com/bradfitz/gomemcache |
| .NET | EnyimMemcached | NuGet |
3. 多语言连接示例
3.1 Python(pymemcache)【推荐】
from pymemcache.client.base import Client
from pymemcache import serde
# 基础连接(长连接 + 二进制)
client = Client(
('192.168.1.100', 11211),
timeout=2.0,
connect_timeout=2.0,
no_delay=True, # TCP_NODELAY
serde=serde.pickle_serde # 自动序列化 Python 对象
)
# 测试
client.set('user:1001', {'name': '张三', 'age': 25}, expire=3600)
print(client.get('user:1001')) # {'name': '张三', 'age': 25}
连接池(高并发推荐)
from pymemcache.client.hash import HashClient
from pymemcache import pooled
# 连接池(最大 50 个连接)
PooledClient = pooled.PooledClient
client = PooledClient(
('192.168.1.100', 11211),
max_pool_size=50,
timeout=2.0
)
with client as c:
c.set('key', 'value')
3.2 PHP(Memcached 扩展)
<?php
$mc = new Memcached();
$mc->addServer('192.168.1.100', 11211);
// 长连接池
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc->setOption(Memcached::OPT_TCP_NODELAY, true);
$mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 2000);
// 测试
$mc->set('user:1', ['name' => '李四'], 3600);
print_r($mc->get('user:1'));
?>
3.3 Java(XMemcached)
<!-- pom.xml -->
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.8</version>
</dependency>
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("192.168.1.100:11211")
);
builder.setConnectionPoolSize(10); // 连接池
builder.setConnectTimeout(2000);
MemcachedClient client = builder.build();
client.set("key1", 3600, "Hello Memcached");
System.out.println(client.get("key1"));
client.shutdown();
3.4 Node.js(memjs)
npm install memjs
const memjs = require('memjs');
const client = memjs.Client.create('192.168.1.100:11211', {
failover: false,
timeout: 2
});
client.set('key', 'value', { expires: 3600 }, (err, val) => {
client.get('key', (err, val) => {
console.log(val.toString()); // value
client.close();
});
});
4. 集群连接(多节点)
4.1 一致性哈希(自动分片)
# Python pymemcache
client = HashClient([
('10.0.1.10', 11211),
('10.0.1.11', 11211),
('10.0.1.12', 11211)
], use_pooling=True, pool_size=20)
节点增减,只影响部分 Key,不引发雪崩。
4.2 手动分片(按业务)
# 用户数据 → 节点1,订单 → 节点2
user_client = Client(('10.0.1.10', 11211))
order_client = Client(('10.0.1.11', 11211))
5. 连接安全加固
| 风险 | 解决方案 |
|---|---|
| 明文传输 | 部署在 内网,禁止公网访问 |
| 无认证 | 使用 防火墙 限制来源 IP |
| DDoS 反射攻击 | 禁用 UDP:启动时加 -U 0 |
防火墙示例(Linux)
# 只允许 10.0.1.0/24 访问
sudo ufw allow from 10.0.1.0/24 to any port 11211
Memcached 启动参数(安全)
memcached -d -m 1024 -p 11211 -u memcache -l 10.0.1.100 -c 4096 -U 0
6. 连接诊断与监控
6.1 检查连接状态
# 查看连接数
echo "stats" | nc 192.168.1.100 11211 | grep curr_connections
6.2 连接测试脚本
# test_conn.sh
#!/bin/bash
HOST=192.168.1.100
PORT=11211
echo "set test 0 10 5" | nc $HOST $PORT | grep STORED
echo "get test" | nc $HOST $PORT
6.3 Prometheus 监控
# prometheus.yml
scrape_configs:
- job_name: 'memcached'
static_configs:
- targets: ['192.168.1.100:9150']
7. 连接池最佳实践
| 场景 | 推荐配置 |
|---|---|
| 低并发(< 100 QPS) | 单连接 |
| 中并发(100 ~ 1000 QPS) | 连接池 10~20 |
| 高并发(> 1000 QPS) | 连接池 50+,配合本地缓存 |
避免:每次请求都
new Client()
8. 常见连接错误及解决
| 错误 | 原因 | 解决方案 |
|---|---|---|
Connection refused | 服务未启动 / 防火墙 | systemctl start memcached |
Timeout | 网络延迟 / 连接池耗尽 | 增加 timeout / 扩大连接池 |
Server went away | Memcached 重启 | 客户端重连机制 |
No servers available | 节点列表为空 | 检查配置 |
Python 重连示例
from pymemcache.exceptions import MemcacheError
import time
def safe_set(client, key, value):
for _ in range(3):
try:
return client.set(key, value)
except MemcacheError:
time.sleep(0.1)
raise Exception("Memcached 连接失败")
9. 连接配置模板(生产推荐)
# config.ini
[memcached]
servers = 10.0.1.10:11211,10.0.1.11:11211 timeout = 2.0 connect_timeout = 1.0 pool_size = 20 binary = True tcp_nodelay = True
小结:连接检查清单
| 项目 | 检查 |
|---|---|
| 端口开放 | telnet 192.168.1.100 11211 |
| 服务运行 | systemctl status memcached |
| 防火墙允许 | ufw status |
| 客户端长连接 | persistent=True |
| 连接池配置 | pool_size ≥ 10 |
| 监控告警 | curr_connections、get_hits |
下一步建议:
- 写一个 连接健康检查 API
- 实现 自动故障转移
- 集成 OpenTelemetry 链路追踪
需要 连接池源码分析、SASL 认证版、TLS 加密连接?继续问我!