Как установить и использовать Redis

Что такое Redis?

Redis был разработан в 2009 году и представляет собой хранилище типа ключ-значение. Следуя опыту таких NoSQL баз данных, как Cassandra, CouchDB и MongoDB, Redis позволяет хранить большой объем данных без ограничений реляционных баз данных. Также его часто сравнивают с memcache, он находит применение в качестве БД для кеширования.

Настройка

Перед установкой 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`, в результате чего программа будет установлена глобально:

```bash
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

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

> 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 также поддерживает выполнение транзакций, которые должны следовать двум принципам:

  1. Команды должны выполняться по порядку. Они не будет прерваны другими запросами в течение всего процесса.
  2. Должна быть обеспечена целостность транзакции.

Транзакции начинаются с команды 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"

Заключение

Redis быстро завоёвывает популярность с момента своего выпуска среди таких проектов, как github, flickr, Disqus и Craigslist. Также хранилище работает с большинством языков программирования.