Memcached 连接

Memcached 连接全攻略(2025 版)

下面从 连接方式 → 客户端选择 → 多语言示例 → 连接池 → 集群连接 → 安全加固 → 监控诊断 一步步讲解如何 可靠、高效、安全 地连接 Memcached。


1. 连接基础参数

参数说明示例
HostIP 或域名192.168.1.100
Port默认端口11211
Timeout连接/读写超时2.5
Persistent长连接(推荐)True
Binary Protocol二进制协议(更快)启用

推荐:使用 长连接 + 二进制协议


2. 客户端选择(主流语言)

语言推荐客户端安装方式
Pythonpymemcachepip install pymemcache
PHPMemcached(PECL)pecl install memcached
JavaXMemcachedMaven 依赖
Node.jsmemjsnpm install memjs
Gogomemcachego get github.com/bradfitz/gomemcache
.NETEnyimMemcachedNuGet

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 监控

使用 memcached_exporter

# 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 awayMemcached 重启客户端重连机制
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_connectionsget_hits

下一步建议

  • 写一个 连接健康检查 API
  • 实现 自动故障转移
  • 集成 OpenTelemetry 链路追踪

需要 连接池源码分析SASL 认证版TLS 加密连接?继续问我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部