2013-07-30 2 views
3

Перед использованием redis Я хочу проверить его наличие, если redis недоступен, я буду использовать mysql, если redis доступен, я его использую. Как я могу это сделать, если я использую клиент predis?Проверка доступности Redis

Мой первый метод был:

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

     return true; 
    } 

Но это была очень плохая идея, потому что я занимаю свободные сокеты. Теперь я пытаюсь найти лучший метод.

+0

А что, если MySQL также не доступный? Ваш подход нарушен: если пользователь/admin предоставил вашему коду конфигурацию для Redis, предположите, что он есть и должен использоваться. Если нет, справитесь с этим, например. путем отказа и жалобы на неправильную конфигурацию. – Sven

+0

В чем вопрос? Какой лучший метод вы пробовали? – hakre

+0

Прошу прощения за ошибку. Теперь я пытаюсь найти лучший метод.Mysql всегда доступен, но если будет слишком много запросов, у redis будут проблемы со всеми из них, и в этот момент я хочу переместить часть запросов в mysql. Поэтому я стараюсь знать, может ли redis обрабатывать запрос или нет. – aieven

ответ

1

Используйте клиента predis и команду PING.

  • return true если PONG получен в качестве ответа.
  • return false on CommunicationException.
2

Redis может обрабатывать гораздо больше запросов, чем MySQL, поэтому он так часто используется в качестве кеша для него. На аппаратном уровне ноутбука я видел, что он обрабатывал более 1 млн запросов в секунду - один экземпляр не настраивал на стороне сервера.

Сначала попробуйте вытащить данные из redis. Если соединение не удается, перейдите в MySQL. если вы получите нулевую обратную связь, перейдите в MySQL и добавьте данные в Redis (опционально с тайм-аутом в зависимости от ваших критериев) и верните данные клиенту.

Пожалуйста, не делайте пинг перед каждой командой. Если у вас есть действующее соединение, попробуйте получить данные и обработать их обратно. Получение нулевого возврата означает, что данных не было. Выполнение пинга перед каждой командой является расточительным. Вы проводите поездку туда и обратно для каждого звонка. Часто команда получать данные просто или почти так же быстро, как и ping, особенно учитывая стоимость тестирования для понга. Если учесть, что вы затем будете также, проверьте, были ли вы получены данные, пинг перед каждой моделью команды не является разумным.

Откройте соединение в своем долгосрочном процессе за пределами команды или откройте запрос, , а затем закройте свою розетку. Я предпочитаю первое, но понимаю, что это не всегда возможно в зависимости от используемой структуры.

И как человек, у которого есть инфраструктура со многими сотнями серверов MySQL с тысячами БД, нет, вы не всегда можете предположить, что MySQL есть, так же, как вы не должны предполагать, что Redis всегда будет там. Аварии случаются, происходят сети, серверы сбиваются или ошибочно отскакивают.

Но вы можете следить за потоком «есть соединение TCP в живом» и «затем дать мне данные», а затем подтвердить, что вы получили данные. До тех пор, пока у вас возникнут проблемы с неудачными подключениями или запрошенными запросами, и обрабатывайте их, вы в порядке.

Насколько как на самом деле код с помощью predis, я рекомендую начать с Документами, которые встречаются в the Predis github page

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 */ 
} 
Смежные вопросы