本文介绍使用 PHP 客户端通过代理模式和直连模式连接腾讯云分布式缓存数据库实例的示例。
准备工作
环境要求
PHP 7.0及以上版本。
已安装 phpredis 扩展(推荐5.0及以上版本)。
安装客户端
通过 PECL 安装 phpredis 扩展:
pecl install redis
安装完成后,在
php.ini 中添加以下配置:extension=redis.so
验证安装:
php -m | grep redis
获取连接信息
1. 登录 分布式缓存数据库控制台。
2. 在实例列表中,单击目标实例 ID,进入实例详情页。
3. 在网络信息区域,获取实例的连接地址和端口号。
代理模式:获取 VIP 地址和端口(默认6379)。
直连模式:获取各分片节点地址和端口(默认6379)。
4. 在配置信息区域,获取实例的连接密码。代理模式与直连模式的认证方式不同:
代理模式:默认账号使用
实例 ID:密码 格式,自定义账号使用 用户名@密码 格式;免密认证实例无需密码。直连模式:复用 Redis 原生 ACL 认证机制,不支持
用户名@密码 拼接格式,支持以下两种认证方式:默认账号:仅需密码,即
AUTH password。自定义账号:需同时指定账号名与密码,即
AUTH account password。代理模式连接示例
代理模式下,客户端通过 Proxy 代理层提供的统一 VIP 地址连接实例,Proxy 自动处理请求路由和故障转移,客户端无需感知后端拓扑变化。
基础连接示例
<?php// 连接参数$host = "192.xx.xx.2"; // 实例 VIP 地址$port = 6379; // 实例端口$password = "crs-xxxx:密码"; // 默认账号密码格式:实例ID:密码// 创建连接$redis = new Redis();// 连接实例,设置超时时间为 2 秒$redis->connect($host, $port, 2.0);// 认证$redis->auth($password);// 选择数据库(代理模式支持多 DB)$redis->select(0);// 写入数据$redis->set("name", "腾讯云分布式缓存数据库");// 读取数据$value = $redis->get("name");echo "get name: " . $value . "\\n";// 设置带过期时间的 Key$redis->setex("session:user123", 3600, "session_data");// 哈希操作$redis->hSet("user:1001", "name", "张三");$redis->hSet("user:1001", "age", "28");$userInfo = $redis->hGetAll("user:1001");echo "user info: ";print_r($userInfo);// 关闭连接$redis->close();?>
自定义账号连接示例
<?php$host = "192.xx.xx.2";$port = 6379;$username = "myuser";$password = "myuser@MyPassword"; // 代理模式自定义账号:用户名@密码整体作为密码传入(区别于直连模式 ACL 的账号名/密码分离传参)$redis = new Redis();$redis->connect($host, $port, 2.0);$redis->auth($password);$redis->set("key", "value");echo $redis->get("key") . "\\n";$redis->close();?>
连接池示例
在高并发场景下,建议使用持久连接(pconnect)复用 TCP 连接,减少连接建立开销:
<?php$host = "192.xx.xx.2";$port = 6379;$password = "crs-xxxx:密码";// 使用持久连接,第四个参数为持久连接标识$redis = new Redis();$redis->pconnect($host, $port, 2.0, "persistent_id_01");$redis->auth($password);// 设置读写超时$redis->setOption(Redis::OPT_READ_TIMEOUT, 2);// 业务操作$redis->set("counter", 0);$redis->incr("counter");$count = $redis->get("counter");echo "counter: " . $count . "\\n";// 持久连接不需要显式关闭,由 PHP 生命周期管理?>
SSL 加密连接示例
<?php$host = "192.xx.xx.2";$port = 6379;$password = "crs-xxxx:密码";$caCertPath = "/path/to/ca.pem"; // CA 证书文件路径$redis = new Redis();// 配置 TLS/SSL 参数$redis->connect("tls://" . $host, $port, 2.0, null, 0, 0, ['stream' => ['verify_peer' => true,'verify_peer_name' => false,'cafile' => $caCertPath,]]);$redis->auth($password);$redis->set("ssl_test", "encrypted_connection");echo $redis->get("ssl_test") . "\\n";$redis->close();?>
直连模式连接示例
直连模式下,客户端使用 Redis Cluster 协议直接连接各分片节点,本地处理 MOVED/ASK 重定向,可直接使用社区标准的 Redis Cluster 客户端接入。
说明:
直连模式仅适用于集群架构实例。
需使用支持 Redis Cluster 协议的客户端(phpredis 扩展的 RedisCluster 类)。
需在控制台开启直连模式并获取各分片节点的连接地址。
认证方式复用 Redis 原生 ACL 机制:默认账号仅传密码,自定义账号需分别传入账号名与密码,不支持
用户名@密码 拼接格式。直连模式暂不支持 SSL 加密连接。
基础连接示例
<?php// 直连模式下各分片节点地址$seeds = ["192.xx.xx.2:6379","192.xx.xx.3:6379","192.xx.xx.4:6379"];$password = "password"; // 直连模式默认账号仅传密码,不带实例 ID 前缀// 创建 RedisCluster 连接// 参数说明:名称, 节点数组, 连接超时, 读取超时, 是否持久连接, 密码$cluster = new RedisCluster(null, // 集群名称,传 null 使用 seeds 方式$seeds, // 分片节点地址列表2.0, // 连接超时(秒)2.0, // 读取超时(秒)false, // 是否持久连接$password // 认证密码);// 写入数据(客户端自动路由到正确的分片)$cluster->set("cluster:key1", "value1");$cluster->set("cluster:key2", "value2");$cluster->set("cluster:key3", "value3");// 读取数据echo "key1: " . $cluster->get("cluster:key1") . "\\n";echo "key2: " . $cluster->get("cluster:key2") . "\\n";echo "key3: " . $cluster->get("cluster:key3") . "\\n";// 哈希操作$cluster->hSet("user:{1001}", "name", "张三");$cluster->hSet("user:{1001}", "age", "28");$userInfo = $cluster->hGetAll("user:{1001}");echo "user info: ";print_r($userInfo);// 使用 Hash Tag 确保相关 Key 路由到同一分片$cluster->set("{order:1001}:status", "paid");$cluster->set("{order:1001}:amount", "99.00");$cluster->set("{order:1001}:time", "2025-01-01 10:00:00");echo "order status: " . $cluster->get("{order:1001}:status") . "\\n";// 关闭连接$cluster->close();?>
持久连接示例
<?php$seeds = ["192.xx.xx.2:6379","192.xx.xx.3:6379","192.xx.xx.4:6379"];$password = "password"; // 直连模式默认账号仅传密码,不带实例 ID 前缀// 使用持久连接的 RedisCluster$cluster = new RedisCluster(null,$seeds,2.0, // 连接超时2.0, // 读取超时true, // 开启持久连接$password);// 设置序列化方式(推荐 PHP 序列化或 JSON)$cluster->setOption(RedisCluster::OPT_SERIALIZER, Redis::SERIALIZER_JSON);// 存储复杂数据结构$data = ["id" => 1001,"name" => "产品A","price" => 99.99,"tags" => ["热门", "推荐"]];$cluster->set("product:1001", $data);// 读取并自动反序列化$product = $cluster->get("product:1001");print_r($product);?>
自定义账号(ACL)连接示例
直连模式复用 Redis 原生 ACL 认证机制,使用自定义账号时需以
[账号名, 密码] 数组形式传入,不支持 用户名@密码 拼接格式。<?php$seeds = ["192.xx.xx.2:6379","192.xx.xx.3:6379","192.xx.xx.4:6379"];// ===== ACL 认证机制:账号名与密码是两个独立字段 =====// 直连模式的多账号能力基于 Redis 原生 ACL:控制台创建的每个自定义账号// 都是一个独立的 ACL user,认证时客户端向节点发送 AUTH <account> <password>。// phpredis 的 RedisCluster 以 [账号名, 密码] 数组形式传入(等价于执行 AUTH account password),// 不要写成代理模式的 "myuser@MyPassword" 拼接格式。$cluster = new RedisCluster(null, // 集群名称,传 null 使用 seeds 方式$seeds, // 分片节点地址列表2.0, // 连接超时(秒)2.0, // 读取超时(秒)false, // 是否持久连接["myuser", "MyPassword"] // ACL 账号:[账号名 → AUTH account, 密码 → AUTH password](纯密码,无需拼接));$cluster->set("key", "value");echo $cluster->get("key") . "\\n";$cluster->close();?>
连接参数说明
参数 | 说明 | 推荐值 |
host | 实例连接地址。代理模式为 VIP 地址,直连模式为分片节点地址 | - |
port | 实例端口号 | 6379 |
timeout | 连接超时时间(秒) | 2.0 |
read_timeout | 读取超时时间(秒) | 2.0 |
persistent | 是否使用持久连接 | 高并发场景建议开启 |
password | 认证密码 | 默认账号格式: 实例 ID:密码 |
常见问题
连接超时
确认客户端所在 CVM 与分布式缓存数据库实例在同一 VPC 内。
确认安全组规则已放通对应端口。
确认连接地址和端口正确。