在使用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;
}
但这是非常糟糕的主意,因为我占用了免费套接字。现在我试着找到一个更好的方法。
答案 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
中找到的文档开始