icyboy / credis
Credis 是一个轻量级接口,用于访问 Redis 键值存储库,当 phpredis 库可用时,它将对其进行封装以提高性能。
Requires
- php: >=5.4.0
README
Credis
Credis 是一个轻量级接口,用于访问 Redis 键值存储库,当可用时,它将 phpredis 库进行封装以提高性能。此项目是从众多 redisent 分支之一派生的。
入门指南
Credis_Client 使用与 Redis 命令相同的名称的方法,并将返回值转换为相应的 PHP 相当物。
require 'Credis/Client.php'; $redis = new Credis_Client('localhost'); $redis->set('awesome', 'absolutely'); echo sprintf('Is Credis awesome? %s.\n', $redis->get('awesome')); // When arrays are given as arguments they are flattened automatically $redis->rpush('particles', array('proton','electron','neutron')); $particles = $redis->lrange('particles', 0, -1);
Redis 错误响应将包装在 CredisException 类中并抛出。
Credis_Client 还支持透明的命令重命名。使用原始命令名称编写代码,客户端将透明地发送别名命令到服务器。使用前缀(用于 md5)、可调用函数、单独的别名或别名数组的映射来指定重命名的命令。有关更多信息,请参阅“Redis 安全”:https://redis.ac.cn/topics/security。
集群服务器
Credis 还包括一种方法,让开发者充分利用 Redis 在多个服务器和 一致性哈希 下的可伸缩性。使用 Credis_Cluster 类,你可以以相同的方式使用 Credis,除了键将在多个服务器之间哈希。以下是设置集群的方法
基本集群示例
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; $cluster = new Credis_Cluster(array( array('host' => '127.0.0.1', 'port' => 6379, 'alias'=>'alpha'), array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'beta') )); $cluster->set('key','value'); echo "Alpha: ".$cluster->client('alpha')->get('key').PHP_EOL; echo "Beta: ".$cluster->client('beta')->get('key').PHP_EOL;
显式定义副本
一致性哈希策略将键存储在一个所谓的 "环" 上。每个键的位置相对于其目标节点的位置。位置最接近的目标节点将是该特定键的选择节点。
为了避免键的分布不均(特别是在小型集群中),通常会将目标节点进行复制。基于副本的数量,每个目标节点将在 "环" 上存在 n 次。
以下示例显式将副本数设置为 5。两个 Redis 实例都将有 5 个副本。默认值为 128。
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; $cluster = new Credis_Cluster( array( array('host' => '127.0.0.1', 'port' => 6379, 'alias'=>'alpha'), array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'beta') ), 5 ); $cluster->set('key','value'); echo "Alpha: ".$cluster->client('alpha')->get('key').PHP_EOL; echo "Beta: ".$cluster->client('beta')->get('key').PHP_EOL;
主/从复制
Credis_Cluster 类还可以用于 主/从复制。Credis_Cluster 将自动执行 读写分离,并将写请求专用于主服务器。除非你在主服务器的连接字符串中将 write_only 标志设置为 true,否则读请求将由所有服务器处理。
Redis 服务器设置为主/从复制
设置主/从复制很简单,只需将以下行添加到从服务器配置中
slaveof 127.0.0.1 6379
基本主/从示例
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; $cluster = new Credis_Cluster(array( array('host' => '127.0.0.1', 'port' => 6379, 'alias'=>'master', 'master'=>true), array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'slave') )); $cluster->set('key','value'); echo $cluster->get('key').PHP_EOL; echo $cluster->client('slave')->get('key').PHP_EOL; $cluster->client('master')->set('key2','value'); echo $cluster->client('slave')->get('key2').PHP_EOL;
主服务器上不读
以下示例说明了如何禁用主服务器的读取。这将导致主服务器仅用于写入。这仅在你有足够的写调用来在主服务器上创建一定负载时才应该发生。否则,这是对服务器资源的不高效使用。
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; $cluster = new Credis_Cluster(array( array('host' => '127.0.0.1', 'port' => 6379, 'alias'=>'master', 'master'=>true, 'write_only'=>true), array('host' => '127.0.0.1', 'port' => 6380, 'alias'=>'slave') )); $cluster->set('key','value'); echo $cluster->get('key').PHP_EOL;
与 Sentinel 的自动故障转移
Redis Sentinel 是一种可以监控 Redis 实例的系统。您可以注册主服务器,Sentinel 会自动检测其从服务器。
当主服务器死亡时,Sentinel 将确保将其中一个从服务器提升为新主服务器。这种自动故障转移机制也会将失败的主服务器降级,以避免数据不一致。
Credis_Sentinel 类与 Redis Sentinel 实例交互,并充当代理。Sentinel 将自动创建 Credis_Cluster 对象,并根据需要设置主服务器和从服务器。
Sentinel 使用与 Redis 相同的协议。以下示例中,我们注册了运行在端口 26379 上的 Sentinel 服务器,并将其分配给 Credis_Sentinel 对象。然后我们询问 Sentinel 已知为主服务器 mymaster 的主机名和端口号。通过调用 getCluster 方法,我们立即获得一个 Credis_Cluster 对象,允许我们执行基本的 Redis 调用。
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; require 'Credis/Sentinel.php'; $sentinel = new Credis_Sentinel(new Credis_Client('127.0.0.1',26379)); $masterAddress = $sentinel->getMasterAddressByName('mymaster'); $cluster = $sentinel->getCluster('mymaster'); echo 'Writing to master: '.$masterAddress[0].' on port '.$masterAddress[1].PHP_EOL; $cluster->set('key','value'); echo $cluster->get('key').PHP_EOL;
附加参数
因为 Credis_Sentinel 会使用 "getCluster" 或 "createCluster" 方法创建 Credis_Cluster 对象,因此可以传递附加参数。
首先有 "write_only" 标志。您还可以定义选定的数据库和副本数量。最后有 "selectRandomSlave" 选项。
在具有多个从服务器的主服务器配置中,使用 "selectRandomSlave" 标志。Credis_Sentinel 将选择一个随机从服务器用于创建 Credis_Cluster 对象,或者将它们全部传递并使用内置的哈希。
以下示例展示了如何使用这三个选项。它选择数据库 2,设置副本数量为 10,不选择随机从服务器,并且不允许在主服务器上读取。
<?php require 'Credis/Client.php'; require 'Credis/Cluster.php'; require 'Credis/Sentinel.php'; $sentinel = new Credis_Sentinel(new Credis_Client('127.0.0.1',26379)); $cluster = $sentinel->getCluster('mymaster',2,10,false,true); $cluster->set('key','value'); echo $cluster->get('key').PHP_EOL;
关于
© 2017 Icyboy