Redis

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:07, 12 декабря 2018.
Redis
Redis Logo.svg
Разработчики: Salvatore Sanfilippo[1][2]
Выпущена: 10 May 2009 года; 11 years ago (2009-05-10)
Постоянный выпуск: 4.0.2 / 21 September 2017 года; 3 years ago (2017-09-21)[3]
Состояние разработки: активное
Написана на: ANSI C
Операционная система: Кросс-платформенное
Локализация: Английский язык
Тип ПО: Хранилище данных
Лицензия: 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 на этой ОС[4]. Компания Microsoft активно работает над переносом Redis на Windows.

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

В версии 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 поддерживает такие высокоуровневые операции, как объединение и разность наборов, а также их сортировку.

Настройка

Перед установкой Redis следует учесть пару нюансов. Для начала обновим пакеты apt-get:

sudo apt-get update

По завершению процесса, установим компилятор с зависимыми пакетами, при помощи которого мы и установим Redis из исходного кода:

sudo apt-get install build-essential

Наконец, скачает tcl:

sudo apt-get install tcl8.5

Установка Redis

После необходимой подготовки, мы готовы приступить к установке Redis из исходников:

wget http://download.redis.io/releases/redis-2.8.9.tar.gz
tar xzf redis-2.8.9.tar.gz
cd redis-2.8.9

Далее выполните команду make:

make

Рекомендуется провести тест сборки:

make test


Закончим, выполнив `make install`, в результате чего программа будет установлена глобально:

sudo make install

По завершению установки, мы получим Redis со встроенным скриптом для запуска сервера в качестве службы. Для доступа к скрипту перейдите в каталог utils:

cd utils 

Запустите скрипт из этого каталога:

sudo ./install_server.sh 

Во время работы скрипта вы можете выбрать настройки по-умолчанию нажав enter. По окончанию работы скрипта Redis сервер будет запущен в фоновом режиме. Запустить и прервать работу сервера можно следующими командами (номер порта зависит от выбранного вами во время установки):

```bash

sudo service redis_6379 start 
sudo service redis_6379 stop 

Получить доступ к БД Redis можно при помощи команды:

redis-cli 

Ваш Redis сервер готов и запущен, подтверждением тому служит строка:

redis 127.0.0.1:6379> 

Для автоматического запуска сервера при загрузке системы выполните:

sudo update-rc.d redis_6379 defaults 

Чтобы вы не запутались и было более понятно, прикрепляю видео с установкой Redis на Ubuntu Server 14.04.4 LTS, а также показан пример записи и получения множества с сортировкой.

Операции Redis

Простейшая команда для добавления строковых данных (основной тип данных) может выглядеть так:

  > SET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees"
   OK 

В этом случае за командой SET следует ключ (users:GeorgeWashington), а за ним значение (сама строка). Двоеточие в Redis не оказывает влияния на команду. Тем не менее его использование полезно для описания ключа.

Извлечь данные можно командой GET:

   GET users:GeorgeWashington
   "job: President, born:1732, dislikes: cherry trees"

Диапазоны

При выгрузке данных можно указывать диапазон при помощи двух параметров: первый и последний элементы (в качестве первого элемента принимают 0). Если последний параметр равен -1, то вы получите все элементы до конца. Например, если список содержит 6 цветов радуги (отсортированных по принципу ROYGBV), вы получите следующие результаты:

   > LRANGE ROYGBV 0 3  
   1) "red"
   2) "orange"
   3) "yellow"
   4) "green"
   > LRANGE ROYGBV 0 -1
   1) "red"
   2) "orange"
   3) "yellow"
   4) "green"
   5) "blue"
   6) "violet"
   > LRANGE ROYGBV 3 -1
   1) "green"
   2) "blue"
   3) "violet" 

Срок действия

Redis полезен в качестве хранилища в котором можно хранить данные с определённым сроком действия. Время действия может быть указано в секундах или в формате Unix timestamp (количество секунд с 1.1.1970).

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

EXPIRE - задает продолжительность действия данных TTL - показывает оставшееся время действия.

  > SET classified:information "Secret Stuff"
  OK
  > EXPIRE classified:information 45
  (integer) 1
  > TTL classified:information
  (integer) 31 

При попытке выборки просроченных данных, мы получим nil

  > GET classified:information
  (nil)

Инкремент

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

  > SET population 6
  OK
  > INCRBY population 10
  (integer) 16
  > INCR population
  (integer) 17 

Транзакции

Redis также поддерживает выполнение транзакций, которые должны следовать двум принципам:

Команды должны выполняться по порядку. Они не будет прерваны другими запросами в течение всего процесса. Должна быть обеспечена целостность транзакции. Транзакции начинаются с команды MULTI, а запускаются командой EXEC. Если по каким-либо причинам транзакция прерывается, Redis заблокирует её выполнение до тех пор, пока не будет выполнена команда redis-check-aof и отменены все изменения. После этого сервер можно будет перезапустить:

   > MULTI
   OK
   > SET population 6
   QUEUED
   > INCRBY population 10
   QUEUED
   > INCR population
   QUEUED
   redis 127.0.0.1:6379> EXEC
   1) OK
   2) (integer) 16
   3) (integer) 1
   4) (integer) 17 

Типы данных Redis

Redis работает с пятью типами данных: Strings (строки), Sets (множества), Sorted Sets (сортированные множества), Lists (списки), Hashes (хеш)

Строки

Строки - самый распространённый тип данных в Redis. Часто встречаемые команды при работе со строками:

SET - установка значения ключу GET - выборка значения по ключу DEL - удаление ключа и значения INCR - автоматический инкремент ключа INCRBY - инкремент на указанную величину EXPIRE - время жизни данных в секундах Строки могут быть использованы для хранения объектов, отсортированных по ключу. Пример:

   > SET newkey "the redis string begins"
   OK
   > GET newkey
   "the redis string begins" 

Множества

Группировать строки можно при помощи множеств - набор строк без сортировки. Часто встречающиеся команды:

SADD - добавление одного или нескольких значений к множеству SMEMBERS - выборка всех значений множества SINTER - выборка общих значений нескольких множеств SISMEMBER - проверка присутствия значения во множестве SRANDMEMBER - выборка случайного значения из множества Множества довольно часто применимы в разных ситуациях. Так как каждое значение множества индивидуально, не требуется проверка перед добавлением. При выполнении команды SADD такая проверка выполняется автоматически.

   > SADD colors red
   (integer) 1
   redis 127.0.0.1:6379> SADD colors orange
   (integer) 1
   redis 127.0.0.1:6379> SADD colors yellow
   (integer) 1
   redis 127.0.0.1:6379> SADD colors orange
   (integer) 0
   redis 127.0.0.1:6379> SMEMBERS colors
   1) "red"
   2) "yellow"
   3) "orange"

Примером использования множеств может быть проверка IP адреса посетителя сайт на уникальность или извлечение случайного значения командой SRANDMEMBER.

Множества с сортировкой

Название говорит само за себя - коллекция строк ассоциированных с численным значением, отсортированных по увеличению этого значения.

Такой тип данных часто применяется с диапазонами, так как добавление и удаление данных выполняется значительно быстрее. Часто встречаемые команды:

ZADD - добавление значения ко множеству ZRANGE - отображение значений отсортированных по индексу (от меньшего к большему) ZREVRANGE - отображение значений отсортированных по индексу (от большему к меньшему) ZREM - удаление значения Мы можем создать простое множество с размерами самых маленьких стран в мире.

   > zadd countries 9 Tuvalu
   (integer) 1
   > zadd countries 62 Liechtenstein
   (integer) 1
   > zadd countries .7 Monaco
   (integer) 1
   > zadd countries .2 VaticanCity
   (integer) 1
   > zadd countries 107 Seychelles
   (integer) 1
   redis 127.0.0.1:6379> zrange countries 0 -1
   1) "VaticanCity"
   2) "Monaco"
   3) "Tuvalu"
   4) "Liechtenstein"
   5) "Seychelles" 

Списки

Списки в Redis - коллекция отсортированных значений, что их и отличает от множеств. Добавление элемента в начало или конец списка выполняется очень быстро даже если список состоит из десяти миллионов элементов. Часто встречающиеся команды:

LPUSH - добавление значения в начало списка RPUSH - добавление значения в конец списка LPOP - выборка и удаление значения первого элемента в списке RPOP - выборка и удаление последнего элемента в списке LREM - удаление диапазона элементов из списка LRANGE - выборка диапазона элементов из списка LTRIM - изменения списка с удалением всех элементов не входящих в указанный диапазон Пример списка людей ответственных за ланч:

   > rpush lunch.provider alice
   (integer) 1
   > rpush lunch.provider bob
   (integer) 2
   > rpush lunch.provider carol
   (integer) 3
   > rpush lunch.provider don
   (integer) 4
   > rpush lunch.provider emily
   (integer) 5 

Добавление человека в начало очереди выглядит следующим образом:

   lpush lunch.provider zoe
   (integer) 6

Команда LRANGE выведет весь список:

   lrange lunch.provider 0 -1
   1) "zoe"
   2) "alice"
   3) "bob"
   4) "carol"
   5) "don"
   6) "emily" 

Списка часто применяются для хранения временных событий или коллекции из ограниченного числа элементов.

Хэш

Хэш в Redis - способ хранения объектов, состоящих из множества полей. Они предназначены для хранения большого числа полей в маленьком пространстве. Хэш способны хранить больше 4 миллиардов пар поле-значение. Часто встречающиеся команды:

HMSET - установка нескольких значений HSET - установка поля со строковым значением HGET - выборка значения по полю HMGET - выборка всех значений указанных полей HGETALL - выборка всех значений Пример использования типа хэш для описания примера с пользователем сайта

   > hmset user:1 username jsmith password 4bAc0s email jsmith@gmail.com
   OK
   > hgetall user:1
   1) "username"
   2) "jsmith"
   3) "password"
   4) "4bAc0s"
   5) "email"
   6) "jsmith@gmail.com" 

Для получения определенной информации используйте команду HMGET

   > hmget user:1 username email
   1) "jsmith"
   "jsmith@gmail.com"

Восстановление данных

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

Репликация

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

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

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

Пример создания реплики

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

redis-cli -p 6379 config set requirepass mypass 

На машине slave прописываем:

redis-cli -p 6380 config set masterauth mypass
redis-cli -p 6380 SLAVEOF master_ip 6379 

Чтобы убедиться, можно просмотреть информацию о репликациях. На master:

redis-cli -p 6379 -a mypass info replication 

На slave:

redis-cli -p 6380 info replication

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

Redis Sentinel

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

  • Мониторинг: 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 не рекомендуется использовать в единственном экземпляре. Кластер Sentinel-узлов поддерживает кворум, благодаря чему, сохраняет работоспособность даже при переменном составе и временном отсутствии некоторых из них.

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 в секунду(бенчмарк).

Примечания

Источники

  1. Хабрахабр [Электронный ресурс]: Redis 2.0 на Хабрахабре / Дата обращения: 21.11.2016. — Режим доступа: http://habrahabr.ru/post/105022/
  2. ruseller.com [Электронный ресурс]:работа с Redis и PHP / Дата обращения: 21.11.2016. — Режим доступа: http://ruseller.com/lessons.php?rub=37&id=2289
  3. beget.ru [Электронный ресурс]: Использование Redis / Дата обращения: 21.11.2016. — Режим доступа:https://beget.ru/articles/redis
  4. laravel [Электронный ресурс]: Redis|Laravel по-русски / Дата обращения: 21.11.2016. — Режим доступа: https://laravel.ru/docs/v3/database/redis
  5. firebearstudio.com [Электронный ресурс]: Настройка Redis и Magento 2 / Дата обращения: 21.11.2016. — Режим доступа: https://firebearstudio.com/blog/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-redis-%D0%B4%D0%BB%D1%8F-magento-2.html
  6. unienc.ru [Электронный ресурс]: Redis|Универсальная энциклопедия / Дата обращения: 21.11.2016. — Режим доступа: http://unienc.ru/w/ru/304639-redis.html
  7. Devacademy [Электронный ресурс]: Как установить и использовать Redis / Дата обращения: 21.11.2016. — Режим доступа: http://devacademy.ru/posts/redis/
  8. 8host [Электронный ресурс]: НАСТРОЙКА КЛАСТЕРА REDIS НА UBUNTU 14.04 / Дата обращения: 21.11.2016. — Режим доступа: https://www.8host.com/blog/nastrojka-klastera-redis-na-ubuntu-14-04/

Ссылки

  • Redis [Электронный ресурс]: Официальный сайт/ Дата обращения: 21.11.2016. — Режим доступа: http://redis.io/
  • Redis [Электронный ресурс]: Список существующих клиентов для Redis/ Дата обращения: 21.11.2016. — Режим доступа: http://redis.io/clients Список существующих клиентов для Redis
  • eax.me [Электронный ресурс]: Записки программиста/ Дата обращения: 21.11.2016. — Режим доступа: http://eax.me/redis/ Записки программиста
  • Хабрахабр [Электронный ресурс]: Redis на habrahabr / Дата обращения: 21.11.2016. — Режим доступа: http://habrahabr.ru/post/204354/ Redis на habrahabr