一个Redis的数组中键以某种方式相关的一个孤立的命名空间。键被分布在多个Redis的实例,使用一致的散列。哈希函数用于分布在阵列的钥匙,以保持均匀分布。这个特性的加入是一个慷慨的赞助商帮助的结果A+E Networks.。
数组是由以下内容组成:
有建立的Redis阵列的多种方式; 它们可以被预先定义在redis.ini使用新RedisArray(字符串$名);
或使用动态创建新RedisArray(数组$主机,数组$选项);
$ra = new RedisArray(array("host1", "host2:63792", "host2:6380"));
function extract_key_part($k) { return substr($k, 0, 3); // hash only on first 3 characters. } $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("function" => "extract_key_part"));
当一个新的节点添加到一个数组,phpredis需要了解它。节点的旧列表变成“前面的”数组,和节点的新列表作为主环。一个节点已添加权后,一些读命令将指向错误的节点和将需要查找钥匙在先前环。
// adding host3 to a ring containing host1 and host2. Read commands will look in the previous ring if the data is not found in the main ring. $ra = new RedisArray(array("host1", "host2", "host3"), array("previous" => array("host1", "host2")));
retry_interval的用于指定的重新连接尝试之间毫秒的延迟情况下,客户失去与服务器连接
$ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("retry_timeout" => 100)));
当一个集群里有很多碎片,但不是他们的必然是使用一次此选项很有用。
$ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("retry_timeout" => 100)));
由于php.ini中的参数必须预先定义,Redis的数组都必须共享相同的.ini设置。
//列表中可用的Redis阵列 ini_set(‘redis.array.names‘,‘用户,朋友‘); //为每个阵列组的主机名。 ini_set(‘redis.arrays.hosts‘, ‘users[]=localhost:6379&users[]=localhost:6380&users[]=localhost:6381&users[]=localhost:6382&friends[]=localhost‘); //设置功能 ini_set(‘redis.arrays.functions‘,‘用户= user_hash‘); 仅供网友//使用索引 ini_set(‘redis.arrays.index‘,‘用户= 1,朋友= 0‘);
Redis的阵列可以使用同样的Redis对象:
$ RA =新RedisArray(“用户”); $岭 - >设置(“用户1:名称”,“乔”); $岭 - >设置(“用户2:名称”,“迈克”);
默认情况下,为了与其他库兼容,phpredis将尝试找到问题的关键名称中大括号括起来的子串,并用它来分发数据。
例如,键“{用户:1}:名称”和“{用户:1}通过电子邮件将”将被存储在同一台服务器上,因为只有“用户:1”将被散列。您可以在Redis的阵列“功能”选项提供自定义的函数名; 这个函数都会被调用的关键需要被散列的时间。它应该采取一个字符串,并返回一个字符串。
为了控制键的手工的分布,就可以提供一个自定义功能或关闭,返回服务器号,这是该指数您使用创建的对象RedisArray服务器的阵列中。
例如,实例化一个RedisArray对象新RedisArray(阵列(“美国主机”,“英国主机”,“去主机”),阵列(“分销商”=>“测距”));
写一个调用的函数“DIST”将返回2
为所有应该结束了“去主机”服务器上的按键。
$ RA =新RedisArray(数组(“主机1”,“主机2”,“host3上”,“主机4”,“主机5”,“host6”,“host7”,“host8”),阵列(“分销商”=>阵列( 2,2)));
此声明,我们开始与2碎片,并转移到4,然后8碎片。初始碎片的数目为2和resharding水平(或迭代次数)为2。
当一个节点从环添加或删除,RedisArray实例必须被实例与节点的“上一个”列表中。以一个调用$岭- > _翻版()
使所有的钥匙,根据节点的新列表重新分配。传递一个回调函数来_rehash()
使得可以跟踪操作的进度:该函数调用的节点名称和数字键将要检查,如_rehash(函数($主机,$计数){。
..});。
它可以自动完成这一过程,通过设置‘autorehash‘=> TRUE
在构造函数中的选项。这将导致需要将它们从先前阵列读取时的键要迁移。
为了迁移按键,它们都必须进行检查和重新处理。如果设置了“索引”选项,每个节点一个密钥列出所有键目前。否则,KEYS
命令用于列出它们。如果提供服务器的“先前”列表中,将使用它作为备份环时密钥不能在当前的环中找到。写操作会一 ??直去新环,而读取将进入新的环第一,和第二环作为备份。
添加和/或删除多个实例被支持。
$ RA =新RedisArray(“用户”); //加载了一个新的配置从redis.ini,使用“既往”上市。 $岭 - > _翻版();
运行该代码:
多/ EXEC仍然可用,但必须在一个节点上运行:
$主机= $岭 - > _目标(“{}用户:用户1:名称”); //找到主机第一 $岭 - >多($主机)//然后在该主机上运行的事务。 - >德尔(“{}用户:用户1:名称”) - >斯雷姆(“{}用户:指数”,“用户1”) - > EXEC();
按键阵列采用跨越多个键Redis的命令时,提供任何保证。除了使用MGET,MSET,和DEL的,一个单一的连接将被使用,并读出或写入存在的所有键。在RedisArray对象中运行键()将在每个节点上执行命令和返回键的关联数组,通过主机名进行索引。
RedisArray对象提供了几种方法,以帮助了解群集的状态。这些方法以下划线开头。
$ラ- > _主机
()→ 返回所选阵列的主机的列表。$ラ- > _函数
()→ 返回用于在一致的散列提取关键部位的功能的名称。$ラ- > _目标($键
)→ 返回到用于规定密钥的主机。$岭- > _实例($主机
)→ 返回连接到特定的节点Redis的实例; 与使用_target
得到一个Redis的对象。$ CD测试 $ ./mkring.sh启动 $ php的数组tests.php
原文:http://www.cnblogs.com/thrillerz/p/5032281.html