Php Redis可用性检查

Php Redis可用性检查,php,redis,Php,Redis,在使用redis之前,我想检查它的可用性,如果redis不可用,我将使用mysql,如果redis可用,我将使用它。如果我使用predis客户端,我该怎么做 我的第一个方法是: /** * @return bool */ public function check(){ if(!@fsockopen ( $server['host'], $server['port'], $errno, $errstr, 3 )){ De

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

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

使用predis客户端和命令

  • 如果收到作为响应的
    PONG
    ,则返回true
  • 通信异常
    上返回false

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

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

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

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

作为一个拥有数百台MySQL服务器和数千个数据库的基础设施的人,不,你不能总是假设MySQL在那里,就像你不应该假设Redis永远在那里一样。发生崩溃、联网、服务器跳闸或错误跳转

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

至于如何实际使用predis编码,我建议从文档开始,例如在

中找到的文档,这应该可以做到;)


如果mysql也不可用呢?你的方法是错误的:如果用户/管理员已经为你的代码提供了Redis的配置,那么假设它在那里并且应该被使用。如果没有,处理它,例如失败并抱怨配置错误。你的问题是什么?你尝试过的更好的方法是什么?我很抱歉犯了一个问题。现在我试图找到一个更好的方法。Mysql始终是可用的,但是如果请求太多,redis将对所有请求都有问题,在那一刻,我想将部分请求移动到Mysql。所以我想知道redis能否处理这个请求。
// 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 */
}