Redis, что такое и с чем его есть?

Цель статьи — ознакомить читателей с этой базой данных, а также изложить свои мысли о том в каких случаях её можно использовать.

Официальный сайт Redis.

Как о нем говорят сами разработчики — Redis это Memcached на стероидах. Основное отличие от Memcached — это то что Redis является персистентным хранилищем. Достигается это за счет того, что данные время от времени (либо при каждой записи но об этом ниже) скидываются на жесткий диск. Это происходит асинхронно и не затрагивает производительность чтения/записи в БД.

Второе важное отличие состоит в том — что редис поддерживает не только простое ключ-значение, а также сложные структуры данных, может выполнять операции с любым из элементов вложенных массивов, хешей не доставая все содержимое ключа. Кстати это учитывая накладные расходы на сериализацию/десериализацию объектов хранимых в мемкашеде может быть просто огромным плюсом в производительности (особенно учитывая скорость десериализации в PHP). Думаю я еще изучу и протестирую этот момент отдельно и выложу результаты.

Кроме всего вышеперечисленного Редис поддерживает репликацию мастер-клиент. Клиент в свою очередь тоже может выступать мастер сервером для других клиентов — это позволяет организовывать своего рода деревья из серверов Редиса. К сожалению реплецирования мастер-мастер на данный момент не поддерживается, но уже сейчас в разработке решение Redis Cluster.

Редис так-же поддерживает атомарные операции, транзакции. Умеет работать с массивами, сортировать их, ограничивать выборки (аналог LIMIT в SQL) и многое другое.

Благодаря этим особенностям, Redis в принципе может выступать в роли основной БД. Естественно это зависит от поставленных задач. Если Вам нужны сложные выборки и сортировки, то в качестве основной БД, придется использовать традиционные SQL решения.

Сфера использования:

  • Может как и Memcached использоваться для кеширования данных(кстати регулярный дамп на жесткий диск можно и отключить при желании)
  • Идеально подходит для реализации разного рода счетчиков, чатов и других подобных задач.
  • В случае если Вам хватает предоставленного функционала — может выступать в качестве основной БД. В таком случае пропадает надобность в лишнем слое логики — кешировании, а в месте с ним пропадает огромный класс проблем в разработке. Вам больше не нужно будет при каждом обновлении данных сбрасывать нужные кеши, отлавливать ошибки связанные с тем что где-то Вы это забыли сделать. Все это будет брать на себя Редис. Просто работайте с базой данной и не о чем таком можете даже не думать. При этом скорость работы по многим тестам (тест, тест2) даже превосходит Memcached. Это отличная идея для высоко нагруженных проектов и я собираюсь некоторые из своих будущих проектов делать исключительно на Redis, а в уже существующие внедряю его там где он даст ощутимый прирост в производительности. Когда же появится достаточно производительная библиотека для PHP то думаю можно будет полностью отказаться от memcached в сторону Redis.

Теперь о недостатках решения:

  • Вам нужно столько оперативной памяти — сколько у Вас есть данных в БД. И с ростом БД будет пропорционально расти и потребление ОЗУ. Конечно, в версии 2 появилась такая вещь как встроенная «виртуальная память» но при её использовании весь смысл Редиса теряется. Так-как скорость работы резко падает.
  • По большинству тестов сам по себе Redis обходит Memcached в производительности. Но проведя небольшой тест я получил другие результаты. Видимо конкретная реализация клиентской библиотеки под PHP в силу того что она достаточно новая, является пока не слишком производительной. В итоге при использовании с PHP, Redis оказывается в проигрыше по производительности. Но даже в таком варианте он не слишком отстает от Memcached. И думаю эта проблема решится в следующих версиях модуля для PHP.
  • При настройках по умолчанию, данные сбрасываются на диск раз в какое-то время/количество запросов. В таком режиме например если у сервера пропадет питание, Вы можете потерять самые свежие данные. Есть возможность настроить другой режим работы, при котором каждая запись в БД сопровождается записью на жесткий диск, но тогда мы снова теряем производительность и смысл использования Редиса. Однако, есть команда которая частично решает эту проблему, она немедленно инициирует новый дамп на жесткий диск. Её к примеру можно использовать после записи только критических данных.

Надеюсь Вы получили представление о том что такое Редис?
Более подробно о конкретном внедрении, синтаксисе, настройке я расскажу в последующих статьях.

This entry was posted in High load and tagged , , . Bookmark the permalink.

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