Redis可用性检查

时间:2013-07-30 08:19:27

标签: php redis

在使用redis之前我想检查它的可用性,如果redis不可用,我将使用mysql,如果redis可用,我将使用它。如果我使用predis客户端,我怎么能这样做?

我的第一种方法是:

    /**
     * @return bool
     */
    public function check(){
        if(!@fsockopen ( $server['host'], $server['port'], $errno, $errstr, 3 )){
            Debug::instance()->log( 'Redis connect error host: ' . $server['host'] . ' port: ' . $server['port'] );
            return false;
        }

        return true;
    }

但这是非常糟糕的主意,因为我占用了免费套接字。现在我试着找到一个更好的方法。

3 个答案:

答案 0 :(得分:6)

这应该可以解决问题;)

// Redis configuration
$vm = array(
    'host'     => '127.0.0.1',
    'port'     => 6379,
    'timeout' => 0.8 // (expressed in seconds) used to connect to a Redis server after which an exception is thrown.
);

$redis = new Predis\Client($vm);
try {
    $redis->ping();
} catch (Exception $e) {
    // LOG that redis is down : $e->getMessage();
}
if(isset($e)) {
    //use MySQL
} else {
/* Use Redis */
}

答案 1 :(得分:2)

使用predis客户端和PING命令。

  • 如果收到PONG作为回复,则返回true。
  • CommunicationException上返回false。

答案 2 :(得分:2)

Redis可以处理比MySQL更多的请求,这就是为什么它经常被用作缓存。在笔记本电脑级硬件上,我看到它每秒处理超过1M的请求 - 单个实例没有特殊的服务器端调整。

首先尝试从redis中提取数据。如果连接失败,请转到MySQL。如果你得到一个null,请转到MySQL并将数据添加到Redis(根据你的标准,可选择超时)并将数据返回给客户端。

请不要在每个命令之前执行ping操作。如果您有有效的连接,请尝试获取数据并处理任何内容。获得空值意味着没有数据可以提取。在每个命令之前执行ping是浪费的。每次通话都要花一次往返。通常,获取数据的命令几乎或几乎与ping一样快,特别是考虑到乒乓测试的成本。在考虑您将进行测试以查看是否返回了数据时,在每个命令模型之前ping是不明智的。

在命令外的长期过程中打开连接,或者每次打开连接,查询,然后关闭套接字。我更喜欢前者,但意识到根据您使用的框架,这并不总是可行的。

作为拥有数百个拥有数千个数据库的MySQL服务器的基础设施的人,你不能总是假设MySQL在那里,正如你不应该假设Redis将永远存在。崩溃发生,网络发生,服务器被绊倒或被错误地弹回。

但你可以按照“是TCP连接活着”和“然后给我数据”的流程,然后验证你得到了数据。只要你考虑到失败的连接或超时请求,并处理它们,你就可以了。

至于如何使用predis进行实际编码,我建议从the Predis github page

中找到的文档开始