深入理解phpredis中的Redis Arrays功能
phpredis A PHP extension for Redis 项目地址: https://gitcode.com/gh_mirrors/ph/phpredis
什么是Redis Arrays
Redis Arrays是phpredis扩展提供的一个高级功能,它允许开发者将数据分布存储在多个Redis实例中,形成一个逻辑上的"数组"或集群。这个功能通过一致性哈希算法(consistent hashing)来实现键的均匀分布,确保数据能够合理地分散在不同的Redis节点上。
Redis Arrays的核心组成
一个Redis Array由以下几个关键部分组成:
- Redis主机列表:包含所有参与数据存储的Redis实例地址
- 键提取函数(可选):用于从键中提取部分内容进行哈希计算,确保相关键存储在同一个节点
- 前节点列表(可选):当节点增减时,用于维护旧节点信息
- 索引选项(可选):以Redis集合形式存储的索引,用于节点变更时的键迁移
- 自动重哈希选项:控制是否在节点变更时自动重新分布键
创建Redis Array的多种方式
基础创建方式
最简单的创建方式是提供Redis实例列表:
$ra = new RedisArray(["host1", "host2:63792", "host2:6380"]);
使用键提取函数
可以通过自定义函数控制键的分布方式:
function extract_key_part($k) {
return substr($k, 0, 3); // 只使用键的前3个字符进行哈希
}
$ra = new RedisArray(["host1", "host2:63792", "host2:6380"],
["function" => "extract_key_part"]);
处理节点变更
当集群节点发生变化时,需要指定previous选项:
// 新增host3节点后,读取操作会先查新环,找不到再查旧环
$ra = new RedisArray(["host1", "host2", "host3"],
["previous" => ["host1", "host2"]]);
重要配置选项详解
连接相关配置
- retry_interval:连接重试间隔(毫秒)
- lazy_connect:延迟连接,适用于大型集群但并非所有分片都同时使用的情况
- connect_timeout:连接超时时间(秒)
- read_timeout:读取超时时间(秒)
哈希算法配置
- algorithm:指定哈希算法(如md5、sha1等)
- consistent:启用ketama一致性哈希算法
认证配置
- auth:设置Redis认证密码
在php.ini中预定义Redis Arrays
对于生产环境,可以在php.ini中预先配置Redis Arrays:
; 定义可用的Redis Arrays
redis.array.names = users,friends
; 设置每个Array的主机列表
redis.arrays.hosts = users[]=localhost:6379&users[]=localhost:6380&friends[]=localhost
; 设置键提取函数
redis.arrays.functions = users=user_hash
; 设置索引选项
redis.arrays.index = users=1,friends=0
; 设置认证密码
redis.arrays.auth = users=mysecretpassword
键哈希策略详解
默认哈希行为
默认情况下,phpredis会查找键中花括号{}包围的部分作为哈希依据。例如:
{user:1}:name
{user:1}:email
这两个键会被分配到同一个节点,因为只有user:1
部分参与哈希计算。
自定义分发函数
可以通过distributor选项完全控制键分发逻辑:
$ra = new RedisArray(["host1", "host2", "host3"],
["distributor" => "dist"]);
function dist($key) {
// 返回目标节点的索引
return $key[0] % 3;
}
键迁移机制
当集群节点发生变化时,需要进行键迁移:
$ra = new RedisArray("users"); // 从redis.ini加载配置
$ra->_rehash(); // 执行重哈希迁移
迁移过程会:
- 创建包含新节点的新环
- 逐个检查旧节点上的所有键
- 重新哈希每个键并可能迁移到新节点
- 更新Array对象使用新节点列表
事务处理(Multi/Exec)
在Redis Array中使用事务需要先确定目标节点:
$host = $ra->_target("{users}:user1:name"); // 先找到目标主机
$ra->multi($host) // 在该主机上开启事务
->del("{users}:user1:name")
->srem("{users}:index", "user1")
->exec();
实用调试方法
Redis Array提供了一些以下划线开头的方法用于调试:
_hosts()
:返回当前Array的所有主机列表_function()
:返回键提取函数名_target($key)
:返回指定键的目标主机_instance($host)
:获取特定主机的Redis实例_continuum()
:返回一致性哈希环信息
使用限制
需要注意以下限制:
- 跨多个键的命令(除MGET/MSET/DEL外)无法保证原子性
- KEYS命令会在所有节点执行并返回关联数组
- 事务必须针对单个节点执行
Redis Arrays为phpredis提供了强大的分布式数据存储能力,通过合理配置可以构建高性能、可扩展的Redis集群解决方案。
phpredis A PHP extension for Redis 项目地址: https://gitcode.com/gh_mirrors/ph/phpredis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考