Credis 是一个轻量级的 Redis 键值存储接口,当 phpredis 库可用时,它会包装该库以获得更好的性能。

v1.16.1 2024-07-04 15:08 UTC

README

Build Status

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

支持的连接字符串格式

$redis = new Credis_Client(/* connection string */);

Unix 套接字连接字符串

unix:///path/to/redis.sock

TCP 连接字符串

tcp://host[:port][/persistence_identifier]

TLS 连接字符串

tls://host[:port][/persistence_identifier]

tlsv1.2://host[:port][/persistence_identifier]

在 php 7.2 之前,tls:// 仅支持 TLSv1.0,可以使用 ssl://tlsv1.2 强制支持 TLSv1.2。

redis 的最新版本不支持旧版 php 默认的协议/加密方式,这可能导致连接失败。

启用传输层安全性 (TLS)

使用 TLS 连接字符串 tls://127.0.0.1:6379 而不是 TCP 连接字符串 tcp://127.0.0.1:6379 以启用传输层安全性。

require 'Credis/Client.php';
$redis = new Credis_Client('tls://127.0.0.1:6379');
$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);

服务器集群化

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;

关于

© 2011 Colin Mollenhour © 2009 Justin Poliey