Redis и области его применения

14 марта 2012

Redis (REmote DIctionary Server) — это нереляционная высокопроизводительная СУБД. Redis хранит все данные в памяти, доступ к данным осуществляется по ключу. Опционально копия данных может храниться на диске. Этот подход обеспечивает производительность, в десятки раз превосходящую производительность реляционных СУБД, а также упрощает секционирование (шардинг) данных.

Коротко о главном

В первом приближении может показаться, что Redis мало чем отличается от Memcached. И действительно, как Redis, так и Memcached хранят данные в памяти и осуществляют доступ к ним по ключу. Оба написаны на Си и распространяются под лицензией BSD. Но в действительности, между Redis и Memcahced больше различий, чем сходства.

В первую очередь, Redis умеет сохранять данные на диск. Можно настроить Redis так, чтобы данные вообще не сохранялись, сохранялись периодически по принципу copy-on-write, или сохранялись периодически и писались в журнал (binlog). Таким образом, всегда можно добиться требуемого баланса между производительностью и надежностью.

Redis, в отличие от Memcached, позволяет хранить не только строки, но и массивы (которые могут использоваться в качестве очередей или стеков), словари, множества без повторов, большие массивы бит (bitmaps), а также множества, отсортированные по некой величине. Разумеется, можно работать с отдельными элементами списков, словарей и множеств. Как и Memcached, Redis позволяет указать время жизни данных (двумя способами — «удалить тогда-то» и «удалить через …»). По умолчанию все данные хранятся вечно.

Интересная особенность Redis заключается в том, что это — однопоточный сервер. Такое решение сильно упрощает поддержку кода, обеспечивает атомарность операций и позволяет запустить по одному процессу Redis на каждое ядро процессора. Разумеется, каждый процесс будет прослушивать свой порт. Решение нетипичное, но вполне оправданное, так как на выполнение одной операции Redis тратит очень небольшое количество времени (порядка одной стотысячной секунды).

В Redis есть репликация. Репликация с несколькими главными серверами не поддерживается. Каждый подчиненный сервер может выступать в роли главного для других. Репликация в Redis не приводит к блокировкам ни на главном сервере, ни на подчиненных. На репликах разрешена операция записи. Когда главный и подчиненный сервер восстанавливают соединение после разрыва, происходит полная синхронизация (resync).

Также Redis поддерживает транзакции (будут последовательно выполнены либо все операции, либо ни одной) и пакетную обработку команд (выполняем пачку команд, затем получаем пачку результатов). Притом ничто не мешает использовать их совместно.

Еще одна особенность Redis — поддержка механизма publish/subscribe. С его помощью приложения могут создавать каналы, подписываться на них и помещать в каналы сообщения, которые будут получены всеми подписчиками. Что-то вроде IRC-чатика.

Также хотелось бы отметить следующее:

  • Redis очень прост (проще пареной репы! :) и прекрасно документирован;
  • На данный момент длина ключа в Redis может составлять до 231 байт, длина строки — до 512 Мб, списки и множества могут содержать до 232 элементов, один экземпляр Redis может хранить до 232 ключей;
  • На одном сервере можно держать несколько пронумерованных баз данных, по умолчанию их число равно 16-и.
  • Приложения, использующие Redis, удобно профилировать (команда slowlog) и отлаживать (команда monitor);
  • Redis написан таким образом, что резервную копию его базы данных можно сделать простым копированием файла дампа, даже во время работы сервера;
  • Официально Windows не поддерживается, но есть неофициальные сборки Redis для Windows;
  • Доступ к серверу можно защитить паролем;
  • Разработка спонсируется компанией VMWare;
  • В настоящее время ведется работа над Redis Cluster;
  • Redis используется в Tumblr, Disqus, Skype, StackOverflow, Instagram, GitHub, Flickr, Digg и много где еще;

Так для каких же целей можно использовать Redis?

Области применения

Самое серьезное ограничение Redis заключается в том, что объем данных, который может хранится на одном физическом сервере, ограничен объемом оперативной памяти на этом сервере. Была предпринята попытка обойти это ограничение за счет использования виртуальной памяти, но эта идея была признана неудачной. Таким образом, хранить в Redis много данных стоит недешево.

Позволю себе привести цитату из The Little Redis Book:

Это тот тип систем, которые вы используете для решения специфических задач. В этом смысле Redis близок к индексирующему движку. Вы не будете писать ваше приложение полностью на Lucene, но если вам нужна хорошая система поиска, она подарит вам полезный опыт.

На ум приходят следующие варианты использования Redis:

  • Хранилище сессий и профилей пользователей;
  • Сервер очередей, плюс держим в уме механизм publish/subscribe;
  • Полноценная замена Memcached, притом в случае с Redis мы получим репликацию, более длинные ключи и значения, возможность восстановления кэша с диска и тп;
  • Место для хранения количества пользователей онлайн, кодов капч, различных флагов, саджестов поисковых запросов;
  • СУБД для небольших приложений — сокращалок ссылок, имиджбордов, возможно даже блогов;
  • Роль «словаря» в шардинге, то есть сервер, который знает, какие шарды на каких серверах искать;
  • Хранилище промежуточных результатов вычислений при обработке больших объемов данных;

Также по юзкейсам см ссылку один и ссылку два. Если среди читателей есть пользователи Redis, мне было бы очень интересно узнать, как вы его используете.

Ссылки по теме

Рекомендую ознакомиться со следующими материалами:

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

Дополнение: Amazon ElastiCache и работа с ним на Scala

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.