CI_Redis или оригинальная библиотека Rediska: Интеграция Codeigniter с nosql-хранилищем Redis

Однажды для проекта phpRecaller — CRM для техподдержки провайдера Trinity, понадобилась интеграция с хранилищем данных Redis. Когда я реализовывал эту связку, актуальная версия recaller’а, 3-я на тот момент, была выполнена, так сказать, в вольном стиле, или грубо говоря — на коленке, и дорабатывалась и улучшалась по мере моего собственного «роста».

Четвертую версию recaller’а я переписал на Codeigniter. Следовательно, в скором времени передо мной вновь встал вопрос подключения Redis’а.

Ну собственно вопрос этот очень тяжелым не был. Я загуглил библиотеки под codeigniter для интеграции с redis и очень скоро нашел одну, по отзывам рабочу на каком-то из буржуйских форумов.

Страничка проекта codeigniter-redis имелась и на github

Довольно потирая руки, я почитал пример контроллера, и завладел таки библиотекой.

Из настроек — подключение сервера: адрес, порт, пароль, если есть. Все в общем-то прозаично.

Поставил. Подключил. Написал запрос ключа. Обновил страничку.

Чудеса! Работает, и есть не просит.

Попробовал один ключ, другой ключ. Все нормально, хотя казалось бы, а что может случиться? Попробовал третий ключ, попробовал несуществующий ключ… Оп. Поймал таймаут. 60 секунд выполнения скрипта, чтобы дать мне понять, что такого абонента не существует. Долгова-то как-то.

Ладно, не собираясь делать преждевременную оптимизацию, решил оставить выяснение до полного подключения библиотеки.

Следующим делом попробовал получить ключи в цикле. 50 штук на страницу. Не так уж и много, на самописном двигле с подключенной Редиской это занимало милисекунды.

Но в этот раз я ждал 15 секунд. Без Redis’а конечно же меньше — 1~2, милисекунды варьировались.

Следующие полчаса я потратил на изучение библиотеки codeigniter-redis и поиск отличий с Rediska.

В родной библиотеке codeigniter это не оставило труда, там был всего один файл: libraries/Redis.php

В Rediska это был файл отвечающий за взаимодействие с сервером: library/Rediska/Connection.php

Копался я не долго, вынес для себя только set_stream_timeout, установив которое в значение 3 в codeigniter-redis получил 5 секундную задержку на несуществующем ключе вместо таймаута, а задержку в 2 секунды вообще не успевал получить информацию.

И перед тем, как снова нырять в код редиски, я подумал: «а какого собственно черта?». Зачем изменять так понравившейся мне библиотеке? Хоть и объемной, но заводящейся из коробки, по принципу «взула i забула».

В общем я без проблем отказался от codeigniter-redis в пользу оригинальной Rediska. Конфиг очевидный, но выложу его все же:

Для начала сама библиотека /applicatuion/libraries/Rediska.php:

    public function __construct(array $options = array())
    {
        // Load codeigniter
        $this->_ci =& get_instance();

        // Load config
        $this->_ci->load->config('redis');

        $options = array(
            'servers' => array(
                array('host' => $this->_ci->config->item('redis_host'), 'port' => $this->_ci->config->item('redis_port'))
            )
        );

        parent::__construct($options);

        $this->_specifiedConnection = new Rediska_Connection_Specified($this);
    }

Теперь настройки /application/config/rediska.php:

$config['redis_host'] = '192.168.200.51';        // Адрес машины с Редисом
$config['redis_port'] = '6379';                // Порт подключения, стандартный 6379
$config['redis_password'] = '';                // пароль, может быть пустым

Мне понадобился autoload, так что:

$autoload['libraries'] = array('database', 'session', 'pagination','rediska');

Ну и в конце концов стандартное использование в любом контроллере (нуу у меня правда во вьюхе):

$this->rediska->get("user:$key1:$key2:something")

Подключив Rediska, я вновь вернул крылья recaller’у. Да, может и не путь самуря, но так хочется иногда завести и поехать, когда нужно просто ехать.

Полезно(1)Бесполезно(0)

Добавить комментарий