5

在使用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;
    }

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

4

3 回答 3

9

这应该可以解决问题;)

// 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 */
}
于 2014-03-01T18:51:41.427 回答
2

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

首先尝试从redis中拉取数据。如果连接失败,请转到 MySQL。如果返回 null,请转到 MySQL 并将数据添加到 Redis(根据您的条件可以选择超时)并将数据返回给客户端。

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

在命令之外的长期进程中打开您的连接,或者每次打开连接、查询然后关闭您的套接字。我更喜欢前者,但意识到这并不总是可能的,具体取决于您使用的框架。

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

但是您可以遵循“TCP 连接是否有效”和“然后给我数据”的流程,然后验证您是否获得了数据。只要您考虑到失败的连接或超时请求并处理它们,就可以了。

至于如何使用 predis 实际编码,我建议从Predis github 页面上的文档开始

于 2013-07-31T05:02:10.510 回答
2

使用 predis 客户端和PING命令。

  • PONG如果作为响应接收到,则返回 true 。
  • 上返回假CommunicationException
于 2013-07-30T12:04:40.633 回答