Практика использования Redis

15.01.2014

Redis

В последней заметке я написал, что будем продолжать или всё таки начинать по-новой писать магазин на yii, т.к. читателям больше всего интересна эта тема. К этой заметке появился комментарий, что раз уж по-новой, то используя redis или mongodb. Конечно мы не будем писать магазин с использованием этих БД, потому что каждому инструменту своё место и они тут будут немного не в тему. Кроме того у меня есть некоторый опыт использования redis и mongodb в веб-приложениях и именно им я хочу поделиться.

Итак, начнём с использования redis в качестве хранилища некоторых параметров нашего приложения.

1. Применение redis в веб-приложениях

Redis - нереляционная высокопроизводительная СУБД, которая позволяет получать доступ к данным посредством ключа и умеет хранить массивы(наборы), словари, списки и строки. Конфигурирование редис также позволяет настроить хранение данных как в памяти, так и на диске + время жизни данных. Ограничение лишь в том, что объем хранимых данных не может привышать объём оперативной памяти, но нам это и ненужно.

Перейдем к некоторым вариантам применения редис:

  • хранение сессий
  • пользователи online
  • очереди
  • голосовалки
  • т.п. (см. Ссылки в конце статьи)

Работая на штаты мы хранили в редис сессии и online пользователей, а вот недавно мне нужно было сделать большой поиск по сайту, который должен случайным образом выдавать результаты + подгружать данные по мере прокрутки страницы вниз. Соответственно, исходя из условий поиска я выбирал id подходящих мне записей, перемешивал, записывал их в редис и при скролле вниз выбирал по 5 штук, через AR выбирал модели и отправлял на страницу, а из redis удалял эти выбранные id.

2. Установка и подключение redis к yii

2.1 Установка redis

Т.к. я работаю в linux mint, установка редис занял ровно 1 команду: apt-get install redis-server.Для управления я использую бесплатную программу Redis Desctop Manager, проверим всё ли правильно установилось - выполним команду:

redis-cli set x 123

И проверим:

Redis Desctop Manager

Как видим - всё ок.

2.2 Установка PhpRedis

Для того чтобы была возможность использовать redis из php нужно установить PhpRedis.

Полную инструкцию по установке можно посмотреть по адресу: http://anton.logvinenko.name/ru/blog/kak-ustanovit-redis-i-redis-php-klient.html

Теперь мы можем использовать в коде класс Redis.

2.3 Работаем с redis

Ну и теперь что осталось - так это положить массив в БД. Для этого напишим небольшой компонент:

class MyRedis extends CComponent
{
  private $_redis;

  public function init()
  {
    try {
      $this->_redis = new Redis();
      $this->_redis->connect('localhost', 6379);
    } catch (RedisException $e) {
      die("Ошибка подключения к Redis");
    }
    $this->_redis->setOption(Redis::OPT_PREFIX, 'yii.');
    $this->_redis->select(1);
  }

  public function getValue($key)
  {
    if (preg_match('/^arr_/', $key))
      return unserialize($this->_redis->get($key));
    return $this->_redis->get($key);
  }

  public function setValue($key, $value)
  {
    if (is_array($value))
      $value = serialize($value);
    $this->_redis->set($key, $value);
    $this->_redis->save();
  }

}

Хочу заметить, если имя ключа начинается с arr_, то значение сериализуется при записи в редис и рассериализуется при получении.

Подключаем в конфиге и пробуем:

Yii::app()->redis->setValue('arr_search', array(1,2,3));
echo Yii::app()->redis->getValue('arr_search');

Сделал этот компонент на скорую руку, вероятнее всего не самое лучшее решение, может кто подскажет как правильно в редис положить массив? Есть ли возможность не используя foreach одним разом сохранить пхпшный массив?

2.4 Подводим итог

По-поводу класса Redis и его методов можно почитать здесь.

Можно пойти дальше и писать в него все сессии, но руками писать такой инструмент глупо, т.к. уже есть готовые решения на все случаи жизни - https://github.com/phpnode/YiiRedis . Этот набор компонентов включает следующие классы для работы с сессиями, кэшированием, счетчиками, списками и т.п.

На самом деле написав 2/3 статьи понял, что уже есть куча примеров использования редис вместе с yii. Поэтому эту статью отношу больше к новичкам в программировании, которые смогут найти для себя новый инструмент.

Ещё один небольшой пример из практики - два грида грузятся в модалке, данные из этих гридов могут переходить из одного в другой. Как раз эти гриды и хранятся в редисе.

3. Материалы для изучения

По Redis:

По Yii и Redis:

blog comments powered by Disqus
Наверх