当前位置:首页 > 问答 > 正文

yii2怎么简单连上redis集群,过程其实没那么复杂分享下经验

你得把环境准备好。

你得确认你的PHP环境里已经装好了Redis的扩展,这个不管是连单机还是连集群,都是必须的,你去看一下你的phpinfo(),找找有没有redis这个模块,如果没有,那就得装一下,用PECL安装的话,一般就是一句命令的事儿:pecl install redis,确保你的扩展版本不要太老,能支持集群功能。

就是重头戏:改Yii2的配置文件。

Yii2连接数据库、缓存什么的,主要都是在配置文件里搞定的,Redis集群也不例外,我们一般是在config目录下的web.php或者main.php里操作,这里假设你是想把Redis集群用作缓存,那我们就主要改cache这个组件,如果你想用来做Session存储或者直接当组件用,原理也差不多。

第一步:注释掉或者备份原来的缓存配置。

如果你之前用的是文件缓存或者别的什么,可以先把它注释掉,就像这样:

'components' => [
    'cache' => [
        // 这是原来的文件缓存,我们先注释掉
        // 'class' => 'yii\caching\FileCache',
    ],
    // ... 其他组件配置 ...
],

第二步,写上新的Redis集群配置。

关键就在这里了,Yii2的yii\redis\Cache类本身是支持Redis集群的,我们不需要换别的类,只需要通过redis这个子配置项来详细设置连接信息,下面这个配置模板你几乎可以拿去直接改改就能用:

'components' => [
    'cache' => [
        'class' => 'yii\redis\Cache',
        'redis' => [
            'host' => '你的第一个Redis节点IP', // '192.168.1.101'
            'port' => 6379, // 默认端口
            'password' => '你的Redis密码', // 如果设置了密码就写,没设置就删掉这行
        ],
    ],
],

看到没?到目前为止,这跟连接一个单机的Redis没有任何区别,那集群的秘密藏在哪儿呢?就藏在host这个参数里!

第三步,也是最核心的一步:把集群的所有节点都告诉Yii2。

Redis集群不是有好几个节点(Node)嘛,比如三主三从什么的,你不需要把每个节点的IP和端口都写在不同的配置里,Yii2的Redis扩展很聪明,它支持一种非常简单的写法,你只需要在host这个参数里,把这些节点的地址用一个数组传进去就行了!

举个例子,假设你的Redis集群有三个主节点,IP分别是168.1.101, 168.1.102, 168.1.103,端口都是默认的6379,那么你的配置就应该写成这样:

'components' => [
    'cache' => [
        'class' => 'yii\redis\Cache',
        'redis' => [
            'host' => [
                '192.168.1.101:6379',
                '192.168.1.102:6379',
                '192.168.1.103:6379',
            ],
            'password' => '你的Redis密码', // 同样,如果集群有密码
        ],
    ],
],

就是这么简单! 你把所有节点的地址列成一个数组,丢给host参数,Yii2底层的PhpRedis扩展就会自动处理剩下的事情了,它会自动发现整个集群的拓扑结构,知道哪个键存储在哪个节点上,并且当某个节点挂掉的时候,它也会尝试进行重连或者转向可用的从节点(前提是你配置了正确的集群,并且有从节点做冗余)。

这里有个非常重要的经验点:关于密码。

如果你的Redis集群设置了密码,而且所有节点用的是同一个密码,那么就像我上面写的那样,直接在password参数里写上这个统一的密码就行了。

有时候可能比较坑爹,集群的每个节点密码不一样(虽然不常见),如果遇到这种情况,上面的配置方法就不行了,这时候你可能需要更底层地去配置连接参数,不过根据我看到的很多网络分享,比如有人在SegmentFault上提问类似问题,大多数情况下集群都是使用同一密码的,所以你先用上面的简单方法试试,九成能成功。

配置好了,怎么测试?

配置保存之后,你就可以在你的代码里像平常一样使用Yii::$app->cache这个组件了,完全不用关心背后是单机Redis还是集群,Yii2已经帮你封装好了。

你可以写个简单的Action测试一下:

public function actionTestRedis()
{
    $cache = Yii::$app->cache;
    // 写一个值进去
    $key = 'test_key_' . time();
    $value = '这是一条来自Yii2的测试数据,现在存储在Redis集群里!';
    $cache->set($key, $value, 60); // 缓存60秒
    // 再把它读出来
    $fetchedValue = $cache->get($key);
    if ($fetchedValue === $value) {
        echo "成功啦!Redis集群连接和读写都正常。";
    } else {
        echo "出问题啦,没读到数据。";
    }
    // 你也可以看看这个key被存在集群的哪个节点上了(这需要更底层的操作,但通常你不需要关心)
}

如果页面输出“成功啦!”,那就恭喜你,Yii2已经完美地连上了你的Redis集群。

最后总结一下,整个过程的核心其实就是:

  1. 确保PHP Redis扩展已安装。
  2. 在Yii2的cache组件配置中,使用yii\redis\Cache类。
  3. redis配置项里,将集群所有节点的地址以数组形式赋值给host参数。
  4. 如果有统一密码,就配置password参数。

真的,就这么四步,你完全不需要去啃什么复杂的Redis集群协议,也不用自己去写节点发现和故障转移的逻辑,Yii2和PhpRedis扩展已经把最脏最累的活都干完了,我们开发者要做的,就是把这个“名单”(节点地址数组)准确地交给它们而已,希望这个经验对你有帮助,下次再遇到Redis集群,直接自信地配上去就行了!

yii2怎么简单连上redis集群,过程其实没那么复杂分享下经验