华为云分布式缓存服务Memcached版对接使用完全指南
1. 引言:为什么选择华为云DCS Memcached
在当今高并发、低延迟的互联网应用场景中,分布式缓存服务已成为提升系统性能的基石。Memcached作为一款高性能的分布式内存对象缓存系统,以其简洁的协议、卓越的读写速度和良好的水平扩展能力,长期占据缓存技术栈的重要位置。华为云分布式缓存服务DCS(Distributed Cache Service)提供的Memcached版,将开源Memcached的能力与华为云的基础设施深度整合,为开发者提供了一种可靠、易用且安全的托管式缓存解决方案。
华为云DCS Memcached支持单机和主备两种部署架构,规格从2GB到64GB可选,能够满足从轻量级应用到大型业务系统的多样化需求。实例支持在线一键扩容,规格变更过程中不影响上层业务,为业务的弹性伸缩提供了极大便利。此外,DCS Memcached提供了密码访问和免密访问两种认证模式,支持基于安全组的访问控制,有效保障了缓存数据的安全。
本文将从零开始,手把手教你如何在华为云上创建Memcached实例,并通过多种客户端完成对接与使用。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2. 创建Memcached实例
2.1 登录控制台并进入缓存管理
首先,登录华为云管理控制台。在控制台左上角单击区域选择下拉框,选择与您的应用程序部署位置相近的区域,以降低网络延迟、提高访问速度。接着,单击左侧菜单栏的“缓存管理”,进入缓存实例信息页面。
2.2 配置实例参数
在“缓存管理”页面,单击“创建缓存实例”,进入实例创建页面。您需要依次配置以下核心参数:
- 计费模式:支持包年/包月和按需计费两种模式。按需计费适合短期或测试场景,包年/包月适合长期稳定运行的生产环境。
- 区域与可用区:选择靠近您业务用户的区域,并可根据需要选择单可用区或跨可用区部署以实现同城灾备。
- 缓存引擎:选择“Memcached”。
- 实例类型:支持单机和主备两种类型。主备实例通过冗余副本实现自动故障切换,提供更高的可用性。
- 规格:根据业务预估的内存需求选择,支持2GB、4GB、8GB、16GB、32GB、64GB等多种规格。
- 虚拟私有云VPC与子网:选择实例所在的VPC和子网。后续连接实例的弹性云服务器ECS必须部署在同一VPC中。
- 安全组:Memcached实例通过安全组进行访问控制。请选择或创建允许您所需端口(默认11211)通信的安全组。
- 访问方式:支持“密码访问”和“免密访问”两种模式。出于安全考虑,生产环境强烈建议选择“密码访问”。选择密码访问后,需要设置用户名和密码。Memcached密码访问模式下,实例只能使用二进制协议并进行SASL鉴权。
- 自动备份:仅主备实例支持该选项,可定期备份缓存数据。
- 实例名称与数量:设置实例名称和创建数量。
配置完成后,单击“立即创建”,确认实例信息无误后提交请求。缓存实例创建大约需要5到15分钟,实例状态变为“运行中”即表示创建成功。
3. 连接前的网络准备
在正式连接Memcached实例之前,需要确保网络环境配置正确。华为云DCS Memcached实例默认部署在VPC内部网络中,不直接暴露于公网。以下是连接前的核心检查项:
- 同一VPC:用于连接Memcached的弹性云服务器ECS必须与Memcached实例属于同一个VPC。
- 安全组规则:ECS与Memcached实例需要配置相同的安全组,或通过设置安全组规则确保网络互通。
- 跨VPC访问:如果ECS与Memcached实例不在同一VPC中,可以通过建立VPC对等连接的方式连通网络。
完成网络配置后,在“缓存管理”页面单击实例名称进入概览页面,即可查看并获取该Memcached实例的IP地址/域名和端口。这些信息将在后续客户端连接中用到。
4. 使用Telnet客户端连接Memcached
Telnet是最简单的连接方式,适合用于快速验证实例连通性和调试Memcached命令。Memcached支持基于TCP的文本协议,通过ASCII文本传递命令,便于用户编写客户端和调测问题。
4.1 前提条件
- 已成功创建Memcached实例且状态为“运行中”。
- 已创建同一VPC内的弹性云服务器ECS,并已安装Telnet客户端。
4.2 安装Telnet客户端
在Linux系统中,如果没有安装Telnet客户端,可执行以下命令安装:
yum -y install telnet在Windows系统中,可通过“控制面板 > 程序 > 打开或关闭Windows功能”,找到并打开“Telnet客户端”功能。
4.3 连接实例
登录ECS,执行以下命令连接Memcached实例:
telnet {ip_or_domain_name} {port}其中{ip_or_domain_name}为Memcached实例的IP地址/域名,{port}为端口(默认为11211)。连接成功后,界面提示如下:
Trying XXX.XXX.XXX.XXX...
Connected to XXX.XXX.XXX.XXX.
Escape character is '^]'.4.4 执行Memcached命令
如果Memcached实例为免密访问模式,连接后可直接执行命令。如果为密码访问模式,连接后需要先执行认证命令:
auth 用户名@密码认证通过后,即可执行Memcached命令。以下是一个简单的set和get操作示例:
set hello 0 0 6
world!
STORED
get hello
VALUE hello 0 6
world!
END需要特别注意的是,Memcached文本协议不支持认证操作,因此密码访问模式的实例必须通过二进制协议连接。Telnet使用的是文本协议,所以仅适用于免密访问模式的实例。
5. 使用Java客户端(Spymemcached)连接Memcached
Spymemcached是Java生态中最流行的Memcached客户端之一,支持二进制协议和SASL认证。
5.1 前提条件
- 已成功创建Memcached实例且状态为“运行中”。
- 已创建同一VPC内的ECS,并已安装好Java开发环境。
5.2 Maven依赖
在项目的pom.xml中添加Spymemcached依赖:
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>5.3 密码模式连接代码
以下代码演示了通过SASL认证方式连接密码访问模式的Memcached实例:
import net.spy.memcached.AddrUtil;
import net.spy.memcached.ConnectionFactoryBuilder;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.auth.AuthDescriptor;
import net.spy.memcached.auth.PlainCallbackHandler;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class MemcachedJavaDemo {
public static void main(String[] args) {
String host = "{ip_or_domain_name}";
int port = 11211;
String userName = "{userName}";
String password = "{password}";
try {
// 配置SASL认证
AuthDescriptor authDescriptor = new AuthDescriptor(
new String[]{"PLAIN"},
new PlainCallbackHandler(userName, password)
);
// 创建连接工厂,启用二进制协议和认证
ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
builder.setProtocol(ConnectionFactoryBuilder.Protocol.BINARY);
builder.setAuthDescriptor(authDescriptor);
// 创建Memcached客户端
MemcachedClient client = new MemcachedClient(
builder.build(),
AddrUtil.getAddresses(host + ":" + port)
);
// 执行set操作
client.set("key", 0, "hello world!");
System.out.println("set('key', 'hello world!') 执行成功");
// 执行get操作
Object value = client.get("key");
System.out.println("get('key') = " + value);
// 关闭连接
client.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
}5.4 免密模式连接代码
如果实例开启了免密访问,可以省略认证配置:
import net.spy.memcached.AddrUtil;
import net.spy.memcached.MemcachedClient;
import java.io.IOException;
public class MemcachedJavaDemo {
public static void main(String[] args) {
String host = "{ip_or_domain_name}";
int port = 11211;
try {
MemcachedClient client = new MemcachedClient(
AddrUtil.getAddresses(host + ":" + port)
);
client.set("key", 0, "hello world!");
System.out.println("set('key', 'hello world!') 执行成功");
Object value = client.get("key");
System.out.println("get('key') = " + value);
client.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
}6. 使用Python客户端(python-binary-memcached)连接Memcached
python-binary-memcached是一个纯Python实现的Memcached客户端,支持二进制协议和SASL认证。
6.1 前提条件
- 已成功创建Memcached实例且状态为“运行中”。
- 已创建同一VPC内的ECS,并已安装好Python 2.7.6或更高版本。
6.2 安装依赖包
将获取的python-binary-memcached-x.y.z.zip依赖包上传到ECS,执行以下命令安装:
unzip -xzvf python-binary-memcached-x.y.z.zip
cd python-binary-memcached-x.y.z
python setup.py install如果安装报错,可使用apt或yum方式安装:
apt install python-pip
pip install python-binary-memcached6.3 密码模式连接代码
新建Python文件(如dcs_test.py),写入以下代码:
import bmemcached
# 连接Memcached实例,开启密码认证
client = bmemcached.Client(('{ip_or_domain_name}:{port}'), '{userName}', '{password}')
# 执行set操作
print("set('key', 'hello world!')")
print(client.set('key', 'hello world!'))
# 执行get操作
print("get('key')")
print(client.get('key'))运行该文件:
python dcs_test.py预期输出结果如下:
set('key', 'hello world!')
True
get('key')
hello world!6.4 免密模式连接代码
如果实例开启了免密访问,可省略用户名和密码参数:
import bmemcached
# 连接Memcached实例,免密访问
client = bmemcached.Client('{ip_or_domain_name}:{port}')
print("set('key', 'hello world!')")
print(client.set('key', 'hello world!'))
print("get('key')")
print(client.get('key'))7. 使用PHP客户端(libmemcached)连接Memcached
libmemcached是Memcached的C/C++客户端库,PHP通过其扩展模块可以方便地连接Memcached实例。
7.1 前提条件
- 已成功创建Memcached实例且状态为“运行中”。
- 已创建同一VPC内的ECS,并已安装好PHP开发环境。
7.2 安装libmemcached
在ECS上执行以下命令安装libmemcached:
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -xvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached
make && make install安装libmemcached之前需要确保已安装gcc和sasl相关组件,否则编译过程会报错。
7.3 安装PHP memcached扩展
执行以下命令安装PHP memcached扩展:
wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
phpize
./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
make && make install7.4 配置PHP扩展
找到pdo.ini文件,增加以下配置:
extension=memcached.so
memcached.use_sasl = 17.5 连接代码
新建memcached.php文件,写入以下代码:
<?php
$connect = new Memcached();
// 关闭压缩
$connect->setOption(Memcached::OPT_COMPRESSION, false);
// 使用二进制协议
$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
// 关闭TCP延迟
$connect->setOption(Memcached::OPT_TCP_NODELAY, true);
// 添加服务器
$connect->addServer('{ip_or_domain_name}', {port});
// 如果实例开启了密码访问,需设置SASL认证
$connect->setSaslAuthData('{userName}', '{password}');
// 执行set操作
$connect->set("DCS", "Come on!");
echo 'DCS: ' . $connect->get("DCS") . "\n";
$connect->quit();
?>运行该文件,预期输出如下:
DCS: Come on!8. 使用C++客户端(libmemcached)连接Memcached
libmemcached提供了C/C++接口,适合对性能要求较高的C++应用。
8.1 前提条件
- 已成功创建Memcached实例且状态为“运行中”。
- 已创建同一VPC内的ECS,并已安装好GCC 4.8.4或更高版本。
8.2 安装libmemcached
安装步骤与PHP部分相同,参考7.2节。
8.3 连接代码示例
#include <libmemcached/memcached.h>
#include <string>
#include <iostream>
int main() {
// 创建memcached客户端
memcached_st *memc = memcached_create(NULL);
// 添加服务器
memcached_return_t rc;
rc = memcached_server_add(memc, "{ip_or_domain_name}", {port});
if (rc != MEMCACHED_SUCCESS) {
std::cerr << "添加服务器失败: " << memcached_strerror(memc, rc) << std::endl;
return 1;
}
// 如果实例开启了密码访问,设置SASL认证
// 注意:libmemcached的SASL认证需要额外配置
// 执行set操作
const char *key = "key";
const char *value = "hello world!";
size_t value_len = strlen(value);
rc = memcached_set(memc, key, strlen(key), value, value_len, 0, 0);
if (rc != MEMCACHED_SUCCESS) {
std::cerr << "set操作失败: " << memcached_strerror(memc, rc) << std::endl;
} else {
std::cout << "set('key', 'hello world!') 执行成功" << std::endl;
}
// 执行get操作
size_t return_value_len;
uint32_t flags;
char *return_value = memcached_get(memc, key, strlen(key), &return_value_len, &flags, &rc);
if (rc == MEMCACHED_SUCCESS) {
std::cout << "get('key') = " << return_value << std::endl;
free(return_value);
} else {
std::cerr << "get操作失败: " << memcached_strerror(memc, rc) << std::endl;
}
// 释放资源
memcached_free(memc);
return 0;
}9. Memcached协议与命令详解
华为云DCS Memcached兼容开源Memcached协议,支持基于TCP的文本协议和二进制协议。
9.1 文本协议
Memcached文本协议通过ASCII文本传递命令,便于用户编写客户端和调测问题,甚至可以直接使用Telnet连接。文本协议与二进制协议相比,兼容更多的开源类型客户端,但文本协议不支持认证操作。因此,文本协议仅适用于免密访问模式的实例。
华为云DCS Memcached对文本协议命令的支持情况如下:
- add:新增数据
- set:设置数据(新增或修改)
- replace:更新数据
- append:向指定key的value末尾追加数据
- prepend:向指定key的value头部追加数据
- cas:检查并修改数据
- get:查询数据
- gets:查询数据详细信息
- delete:删除数据
- incr:算数增
- decr:算数减
- touch:修改数据过期时间
- quit:断开连接
- flush_all:清空数据(delay参数必须为0)
- version:查询服务版本信息
- stats:运行统计信息管理(仅支持基础统计信息)
9.2 二进制协议
Memcached二进制协议将命令及所操作的内容按照特定结构进行编码后发送,通过预定的字节串表示命令。二进制协议与文本协议相比,功能更多,支持SASL认证更加安全。密码访问模式的Memcached实例必须使用二进制协议连接。
华为云DCS Memcached对二进制协议命令的支持情况如下:
- 0x00 GET:查询数据
- 0x01 SET:设置数据(新增或修改)
- 0x02 ADD:新增数据
- 0x03 REPLACE:更新数据
- 0x04 DELETE:删除数据
- 0x05 INCREMENT:算数增
- 0x06 DECREMENT:算数减
- 0x07 QUIT:断开连接
- 0x08 FLUSH:清空数据(delay参数必须为0)
- 0x09 GETQ:查询数据(错误时不返回信息)
- 0x0a NOOP:空操作(相当于ping)
- 0x0b VERSION:查询服务版本信息
- 0x0c GETK:查询数据并返回key
- 0x0d GETKQ:查询数据并返回key(错误时不返回信息)
- 0x0e APPEND:向指定key的value末尾追加数据
- 0x0f PREPEND:向指定key的value头部增加数据
- 0x10 STAT:查询缓存实例的统计信息(仅支持基础统计信息)
10. 实例日常运维与管理
10.1 变更规格
DCS管理控制台支持变更Memcached缓存实例规格,即扩容或缩容。您可以根据业务实际需要,选择合适的实例规格。实例变更规格不会影响实例的连接地址、访问密码及安全组配置等信息,也不需要重启实例。
10.2 备份与恢复
主备类型的Memcached实例支持自动备份功能。您可以在创建实例时开启自动备份,并设置备份策略。备份数据可在实例故障时用于数据恢复。
10.3 监控与告警
华为云DCS提供了丰富的监控指标,包括CPU使用率、内存使用率、连接数、QPS等。您可以在云监控服务中查看这些指标,并设置告警规则,以便及时发现和处理异常情况。
11. 安全配置建议
为保障Memcached实例的数据安全,建议遵循以下最佳实践:
- 启用密码访问:生产环境务必选择密码访问模式,避免实例被未授权访问。
- 使用二进制协议:密码访问模式必须使用二进制协议,二进制协议支持SASL认证,更加安全。
- 合理配置安全组:通过安全组规则限制访问来源IP,仅允许必要的ECS访问Memcached实例。
- 定期更新密码:定期更换实例访问密码,降低密码泄露风险。
- 开启自动备份:主备实例建议开启自动备份,以防数据丢失。
12. 常见问题解答
问1:Memcached实例支持公网访问吗?
答:华为云DCS Memcached实例默认部署在VPC内部网络中,不支持直接通过公网访问。如需从外部访问,可以通过VPN或专线等方式打通网络。
问2:密码访问模式的实例为什么不能用Telnet连接?
答:Telnet使用的是Memcached文本协议,而文本协议不支持认证操作。密码访问模式的实例必须使用二进制协议进行SASL认证。如需使用Telnet调试,可临时开启免密访问,但调试完成后应立即关闭。
问3:DCS Memcached支持哪些数据结构?
答:Memcached本身仅支持key-value结构,value为字符串类型。如果需要更丰富的数据结构(如列表、哈希、集合等),建议使用华为云DCS Redis实例。
问4:Memcached实例的数据如何迁移?
答:由于Memcached本身没有命令可遍历查询所有数据,无法直接从正在使用的Memcached中导出全量数据。建议通过应用程序写日志的方式记录缓存key,同时提取key-value,逐步写入目标实例完成数据迁移。
问5:实例规格变更会影响业务吗?
答:DCS管理控制台支持在线变更规格,变更过程中不会影响实例的连接地址、访问密码及安全组配置,也不需要重启实例,因此对业务无影响。
问6:DCS Memcached与自建Memcached有什么区别?
答:DCS Memcached是华为云提供的托管式缓存服务,无需自行部署和维护服务器。DCS提供了高可用架构、自动故障切换、监控告警、备份恢复等企业级特性,相比自建方案更加稳定和易用。



