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

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

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

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

Установка Redis

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

pacman

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

sudo pacman -S redis

Docker

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

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

docker run --name redis-server redis

Source code

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

Качаем:

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

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

tar xfp redis-stable.tar.gz

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

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

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

sudo pacman -S tcl

Собираем:

cd redis-stable
make
make test

После сборки и проверки — можно вызвать 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:

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
...

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

redis-server /etc/my-redis.conf

Порт:

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 *

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

redis-cli ping
PONG

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

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

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

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

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

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

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

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

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

redis-cli set tetskey testvalue
OK

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

redis-cli bgsave
Background saving started

Лог:


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 файла настроек:

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

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

redis-cli shutdown

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

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

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

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

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

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
...

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

redis-cli get tetskey
"testvalue"

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

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

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

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

Namespaces

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

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

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

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

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

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

Базы данных Redis

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

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

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

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

127.0.0.1:6379> select 1
OK

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

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

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

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"

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

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

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

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