Redis

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Redis
Тип

NoSQL-СУБД
ключ — значение»)

Разработчик

Сальваторе Санфилиппо

Написана на

C

Операционная система

Кроссплатформенный

Языки интерфейса

англ.

Первый выпуск

10 апреля 2009

Последняя версия

3.0.1 (5 мая 2015)

Состояние

активный

Лицензия

BSD

Сайт

redis.io

Redis (REmote DIctionary Server) — сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Нереляционная высокопроизводительная СУБД.

Дизайн[править | править вики-текст]

Хранит базу данных в оперативной памяти, снабжена механизмами снимков и журналирования для обеспечения постоянного хранения. Также предоставляет операции для реализации механизма обмена сообщениями в паттерне publish — subscribe[en]. С его помощью приложения могут создавать каналы, подписываться на них и помещать в каналы сообщения, которые будут получены всеми подписчиками. (IRC-чат). Поддерживает репликацию данных с основных узлов на несколько подчинённых (англ. master — slave replication). Также Redis поддерживает транзакции (последовательное выполнение всех операций, либо ни одной) и пакетную обработку команд (выполнение пакета команд, получение пакета результатов).

Redis работает на большинстве POSIX систем, таких как Linux, *BSD, Mac OS X без каких-либо дополнений. Linux и Mac OS X — две операционные системы, в которых был разработан и в большей степени протестирован Redis, поэтому VMware рекомендует использовать именно их для развертывания. Официальной поддержки для сборок Windows нет, но доступны некоторые опции, позволяющие обеспечить работу Redis на этой ОС[1]. Компания Microsoft активно работает над переносом Redis на Windows.

По состоянию на 15 июля 2011 года разработка Redis спонсировалась компанией VMware[2]. Начиная с мая 2013 г. она спонсируется Pivotal Software.[3]

В версии 2.6.0 добавлена поддержка Lua, позволяющего выполнять запросы на сервере. Lua позволяет атомарно совершить произвольную обработку данных на сервере и предназначена для использования в случае, когда нельзя достичь того же результата с использованием стандартных команд.

Поддерживаемые языки программирования[править | править вики-текст]

Множество языков программирования имеют библиотеки для работы с Redis: C, C++, C#, Clojure, Lisp, Erlang, Java, JavaScript, Haskell, Lua, Perl, PHP, Python, Ruby, Scala, Go, Tcl, Rust.

Модели данных[править | править вики-текст]

Все данные Redis хранит в виде словаря, в котором ключи связаны со своими значениями. Одно из ключевых отличий Redis от других хранилищ данных заключается в том, что значения этих ключей не ограничиваются строками. Поддерживаются следующие абстрактные типы данных:

  • Строки(strings). Базовый тип данных Redis. Строки в Redis бинарнобезопасны, могут использоваться так же как числа.
  • Списки(lists). Классические списки строк, упорядоченные в порядке вставки, которая возможна как со стороны головы, так и со стороны хвоста списка.
  • Множества(sets). Множества строк в математическом понимании: не упорядочены, поддерживают операции вставки, проверки вхождения элемента, пересечения и разницы множеств.
  • Хеш-таблицы(hashes). Классические хеш-таблицы или ассоциативные массивы.
  • Упорядоченные множества(sorted sets). Упорядоченное множество отличается от обычного тем, что его элементы упорядочены по особому параметру "score".

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

Восстановление данных[править | править вики-текст]

Восстановление данных проводится двумя разными способами. Первый - это механизм снимков, в котором данные асинхронно переносятся из оперативной памяти в файл формата *RDB (расширение дампов Redis). Второй способ (с версии 1.1) — файл, доступный только для дозаписи, в котором хранится лог всех операций, изменявших данные в памяти.

Репликация[править | править вики-текст]

Redis поддерживает репликацию типа master-slave. Данные с любого сервера Redis могут реплицироваться произвольное количество раз. Репликация полезна для масштабирования чтения (но не записи) или при очень больших объёмах данных. Все данные, которые попадают на один узел Redis (который называется master) будут попадать также на другие узлы (называются slave). Для конфигурирования slave-узлов можно изменить опцию slaveof или аналогичную по написанию команду (узлы, запущенные без подобных опций являются master-узлами).

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

К сожалению, система репликации Redis еще не поддерживает автоматическую отказоустойчивость. Если master-узел выходит из строя, необходимо вручную выбрать новый master- из списка slave-узлов. Необходимо использовать Redis Sentinel, для мониторинга и автоматического переключения master-узлов, если необходима устойчивая к сбоям система.

Redis Sentinel[править | править вики-текст]

Redis Sentinel [4] - это система, разработанная для помощи в управлении узлами Redis. Она выполняет следующие 4 задачи:

  • Мониторинг - Sentinel постоянно проверяет, что master- и slave- узлы работают так, как ожидается;
  • Уведомление - Sentinel может уведомить системного администратора или другую программу о том, что с отслеживаемыми узлами что-то не так;
  • Автоматическое переключение - Если master-узел не работает так, как ожидается, Sentinel может начать процесс восстановления работоспособности, в котором slave-узел объявляется как master-, другие slave-узлы меняют конфигурацию на использование нового master-узла и приложение информируется об использовании нового адреса master-узла;
  • Поставщик конфигурации - Sentinel сообщает клиентам и другим Redis-узлам адрес текущего master-узла. В случае отказа, Sentinel сообщает новый адрес.

Redis Sentinel входит в состав Redis начиная с версии 2.6 (Sentinel 1 - устарел). Начиная с версии Redis 2.8 поставляется текущая версия - Sentinel 2.

Sentinel не рекомендуется использовать в единственном экземпляре. Кластер Sentiel-узлов поддерживает кворум, благодаря чему, сохраняет работоспособность даже при переменном составе и временном отсутствии некоторых из них.

Redis и Memcached[править | править вики-текст]

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

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

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

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

Производительность[править | править вики-текст]

Высокая производительность Redis обуславливается тем, что все данные хранятся в оперативной памяти. На Linux-сервере начального уровня был установлен результат в 110 000 запросов SET и 81 000 запросов GET в секунду (бенчмарк).

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]