Redis: установка, запуск, примеры

Автор: | 28/05/2018

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

Обслуживаемые им данные хранятся в памяти (in-memory dataset), периодически синхронизируясь с данными на жестком диске, в зависимости от конфигурации Redis.

Установка Redis

Redis можно установить с помощью менеджера пакетов ОС, из исходников, либо запустить из Docker образа.

pacman

На Arch Linux с помощью pacman:

[simterm]

$ sudo pacman -S redis

[/simterm]

Docker

Образ доступе нв Docker Hub тут>>>.

Пример запуска:

[simterm]

$ docker run --name redis-server redis

[/simterm]

Source code

Либо можно скачать исходники с последней версией, и собрать Redis самому.

Качаем:

[simterm]

$ wget http://download.redis.io/redis-stable.tar.gz

[/simterm]

Распаковываем:

[simterm]

$ tar xfp redis-stable.tar.gz

[/simterm]

Проверяем файлы:

[simterm]

$ ls -l
total 1736
drwxr-xr-x 6 setevoy setevoy    4096 Mar 26 19:04 redis-stable
-rw-r--r-- 1 setevoy setevoy 1769936 Mar 26 19:04 redis-stable.tar.gz
$ ls -l redis-stable
total 304
-rw-r--r--  1 setevoy setevoy 157632 Mar 26 19:04 00-RELEASENOTES
-rw-r--r--  1 setevoy setevoy     53 Mar 26 19:04 BUGS
-rw-r--r--  1 setevoy setevoy   1815 Mar 26 19:04 CONTRIBUTING
-rw-r--r--  1 setevoy setevoy   1487 Mar 26 19:04 COPYING
drwxr-xr-x  6 setevoy setevoy   4096 Mar 26 19:04 deps
-rw-r--r--  1 setevoy setevoy     11 Mar 26 19:04 INSTALL
-rw-r--r--  1 setevoy setevoy    151 Mar 26 19:04 Makefile
...
drwxr-xr-x  3 setevoy setevoy   4096 Mar 26 19:04 src
drwxr-xr-x 10 setevoy setevoy   4096 Mar 26 19:04 tests
drwxr-xr-x  8 setevoy setevoy   4096 Mar 26 19:04 utils

[/simterm]

Устанавливаем tcl:

[simterm]

$ sudo pacman -S tcl

[/simterm]

Собираем:

[simterm]

$ cd redis-stable
$ make
$ make test

[/simterm]

После сборки и проверки – можно вызвать make install и начинать пользоваться Redis и утилитами:

  • redis-server: сам сервер
  • redis-sentinel: мониторинг, failover  и другое, см. документацию тут>>>
  • redis-cli: CLI для работы с Redis
  • redis-benchmark: проверка производительности
  • redis-check-aof и redis-check-dump: утилиты для работы с повреждёнными файлами данных

Запуск сервера

При вызове redis-server без аргументов – он будет запущен с файлом настроек по умолчанию – /etc/redis.conf:

[simterm]

$ sudo redis-server
25188:C 28 May 13:05:24.517 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
25188:C 28 May 13:05:24.517 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=25188, just started
25188:C 28 May 13:05:24.517 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
...

[/simterm]

Можно передать свой файл настроек первым аргументом:

[simterm]

$ redis-server /etc/my-redis.conf

[/simterm]

Порт:

[simterm]

$ sudo netstat -anp | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      7736/redis-server * 
tcp6       0      0 :::6379                 :::*                    LISTEN      7736/redis-server *

[/simterm]

Проверяем с помощью ping через CLI:

[simterm]

$ redis-cli ping
PONG

[/simterm]

Сохранение данных

Документация – тут>>>.

При запуске с настройками по умолчанию – Redis выполняет “снимок” данных:

[simterm]

$ cat /etc/redis.conf | grep -w 'save\|appendonly' | grep -v \#
save 900 1
save 300 10
save 60 10000
appendonly no
appendfilename "appendonly.aof"

[/simterm]

Тут SAVE (BGSAVE на самом деле – SAVE будет вызван только если предыдущий BGSAVE завершился с ошибкой) выполняется каждые 900 секунд, если минимум 1 ключ был изменён, либо каждые 300 секунд при изменении 10 ключей, или раз в 60, если были изменены значения 10000 ключей.

SAVE сохраняет снимок данных из памяти на диск (механизм RDB) в файл dump.rdb:

[simterm]

$ cat /etc/redis.conf | grep dbfilename
dbfilename dump.rdb

[/simterm]

Данные можно сдампить вручную, используя команды CLI save или bgsave.

Добавим ключ:значение:

[simterm]

$ redis-cli set tetskey testvalue
OK

[/simterm]

И создаём снимок:

[simterm]

$ redis-cli bgsave
Background saving started

[/simterm]

Лог:


7736:M 28 May 13:49:11.787 * Background saving started by pid 28520
28520:C 28 May 13:49:11.795 * DB saved on disk

Находим файл – каталог /var/lib/redis/, как указано в параметре dir файла настроек:

[simterm]

$ sudo ls -la /var/lib/redis/
total 12
drwx------  2 redis redis 4096 May 28 14:04 .
drwxr-xr-x 23 root  root  4096 May 28 12:54 ..
-rw-r--r--  1 root  root   127 May 28 14:04 dump.rdb

[/simterm]

Останавливаем сервер:

[simterm]

$ redis-cli shutdown

[/simterm]

(при вызове shutdown – Redis тоже сохранит данные).

Запуск из файла RDB

Для проверки – переносим файл снимка:

[simterm]

$ sudo cp /var/lib/redis/dump.rdb /tmp/

[/simterm]

Запускаем Redis из этого файла:

[simterm]

$ redis-server --dbfilename dump.rdb --dir /tmp/
32525:C 28 May 13:51:45.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
32525:C 28 May 13:51:45.480 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=32525, just started
32525:C 28 May 13:51:45.480 # Configuration loaded
...

[/simterm]

Проверяем ключ:

[simterm]

$ redis-cli get tetskey 
"testvalue"

[/simterm]

Добавление, получение, удаление данных

Т.к. Redis является key:value хранилищем, то все данные добавляются через указание ключа.

Для добавления данных – используем SET:

[simterm]

$ redis-cli
127.0.0.1:6379> SET firstkey "First value"
OK
127.0.0.1:6379> SET secondkey "Second value"
OK

[/simterm]

Namespaces

В Redis нет поддержки пространства имён, но возможно использование двоеточия для разделения ключей, что бы избежать проблем с дубликатами, т.к. при выполнении SET firstkey ещё раз – значение будет просто перезаписано:

[simterm]

127.0.0.1:6379> SET firstkey "Third value"
OK
127.0.0.1:6379> GET firstkey
"Third value"

[/simterm]

Тут можно использовать разделение пространства имён, например:

[simterm]

127.0.0.1:6379> SET firstns:firstkey "First value"
OK
127.0.0.1:6379> SET secondns:firstkey "Second value"
OK

[/simterm]

И аналогично их получить с помощью GET:

[simterm]

127.0.0.1:6379> GET firstns:firstkey
"First value"
127.0.0.1:6379> GET secondns:firstkey
"Second value"

[/simterm]

Базы данных Redis

Но, как говорится в посте Storing Data with Redis – использование namespaces плохая идея, и вместо этого лучше использовать базы данных Redis (которые, однако, не поддерживаются в случае использования кластера).

По умолчанию Redis поддерживает 16 БД:

[simterm]

$ cat /etc/redis.conf | grep ^databases
databases 16

[/simterm]

Для переключения между ними – используем SELECT:

[simterm]

127.0.0.1:6379> select 1
OK

[/simterm]

И получаем список всех ключей – обратите внимание на [1] – номер базы:

[simterm]

127.0.0.1:6379[1]> keys *
(empty list or set)

[/simterm]

Возвращаемся к старой базе:

[simterm]

127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "secondns:firstkey"
2) "testkey"
3) "onekey"
4) "firstns:firstkey"
5) "firstkey"
6) "secondkey"

[/simterm]

Так же ключи можно перемещать между базами с помощью MOVE:

[simterm]

127.0.0.1:6379> move firstns:firstkey 1
(integer) 1

[/simterm]

В целом на этом для знакомства хватит.

Ещё можно почитать про клатеризацю Redis, и про типы данных, которые он поддерживает.