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

Thank you for reading this post, don't forget to subscribe!

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

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

Установка Redis

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

Docker

docker run --name redis-server redis

Source code

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

Кача­ем:

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

tar xfp redis-stable.tar.gz

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

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:

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

redis-server /etc/my-redis.conf

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

redis-cli ping
PONG

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

Доку­мен­та­ция — https://redis.io/topics/persistence

При запус­ке с настрой­ка­ми по умол­ча­нию — 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
лог

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

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

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

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

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

redis-server --dbfilename dump.rdb --dir /tmp/

 

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

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