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 для работы с Redisredis-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, и про типы данных, которые он поддерживает.