Redis (от англ. remote dictionary server) — резидентная система управления базами данных класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ — значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений[en].

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

Все данные Redis хранит в виде словаря, в котором ключи связаны со своими значениями. Одно из ключевых отличий Redis от других хранилищ данных заключается в том, что значения этих ключей не ограничиваются строками.

Поддерживаются следующие абстрактные типы данных:

  • строки
  • списки
  • множества
  • хеш-таблицы
  • упорядоченные множества

Тип данных значения определяет, какие операции (команды) доступны для него; поддерживаются такие высокоуровневые операции, как объединение и разность наборов, сортировка наборов.

Так это выше была небольшая теория, посмотрим практику.

ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.2

ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-bionic:~$ sudo ./dproject/default

ekzorchik@srv-bionic:~$ apt-cache show redis-server | grep "Version\|Description-en" | head -n2

Version: 5:4.0.9-1ubuntu0.1

Description-en: Persistent key-value database with network interface

ekzorchik@srv-bionic:~$ sudo apt-get install redis-server -y

Проверить установленную версию Redis сервера на системе:

ekzorchik@srv-bionic:~$ redis-server -v

Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76095d16786fbcba

ekzorchik@srv-bionic:~$ sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup

ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf

# 127.0.0.1 — подключение только с текущего сервера

# 0.0.0.0 - подключению с любого IP

# 172.33.33.2 — подключение только с этого IP-адреса (адрес сервера)

bind 127.0.0.1 ::1

protected-mode yes

port 6379

daemonize yes

#supervised no

supervised auto

pidfile /var/run/redis/redis-server.pid

logfile /var/log/redis/redis-server.log

#Каждые 900 секунд будет происходить сохранение на диск, ведь база работает в памяти, а память быстрее диска

# after 900 sec (15 min) if at least 1 key changed

# after 300 sec (5 min) if at least 10 keys changed

# after 60 sec if at least 10000 keys changed

# т. е. Если 1 ключ меняется то сохранение каждый 900 секунд, если 10000 то 60 секунд

save 900 1

save 300 10

save 60 10000

dir /var/lib/redis

ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status
redis.service | head -n5

● redis-server.service - Advanced key-value store

Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor
preset: enabled)

Active: active (running) since Mon 2019-05-13 09:35:37 MSK; 21ms ago

Docs: http://redis.io/documentation,

man:redis-server(1)

ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep :6379

tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1780/redis-server 1

tcp6 0 0 ::1:6379 :::* LISTEN 1780/redis-server 1

Смотрю логи сервиса базы данных Redis, может есть какие-либо уведомление о работе:

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log

1942:M 13 May 09:58:52.808 # WARNING: The TCP backlog setting of 511 cannot
be enforced because /proc/sys/net/core/somaxconn is set to the lower
value of 128.

1942:M 13 May 09:58:52.809 # Server initialized

1942:M 13 May 09:58:52.809 # WARNING overcommit_memory is set to 0!
Background save may fail under low memory condition. To fix this
issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then
reboot or run the command 'sysctl vm.overcommit_memory=1' for this to
take effect.

А вот и первые замечания, поправляю как хочет сервис:

ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/redis/redis.conf | grep "tcp-backlog""

tcp-backlog 511

ekzorchik@srv-bionic:~$ cat /proc/sys/net/core/somaxconn

128

ekzorchik@srv-bionic:~$ sudo sed -i '/tcp-backlog/s/511/128/' /etc/redis/redis.conf

ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/redis/redis.conf | grep "tcp-backlog""

tcp-backlog 128

ekzorchik@srv-bionic:~$ sudo nano /etc/sysctl.conf

vm.overcommit_memory=1

ekzorchik@srv-bionic:~$ sudo sysctl -p

vm.overcommit_memory = 1

ekzorchik@srv-bionic:~$

ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status
redis.service | head -n5

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log

3463:M 13 May 10:36:10.012 # Server initialized

3463:M 13 May 10:36:10.012 # WARNING you have Transparent Huge Pages (THP)
support enabled in your kernel. This will create latency and memory
usage issues with Redis. To fix this issue run the command 'echo
never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and
add it to your /etc/rc.local in order to retain the setting after a
reboot. Redis must be restarted after THP is disabled.

3463:M 13 May 10:36:10.012 * DB loaded from disk: 0.000 seconds

3463:M 13 May 10:36:10.012 * Ready to accept connections

ekzorchik@srv-bionic:~$ sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never"

ekzorchik@srv-bionic:~$ sudo update-grub

Sourcing file `/etc/default/grub'

Generating grub configuration file ...

Found linux image: /boot/vmlinuz-4.15.0-48-generic

Found initrd image: /boot/initrd.img-4.15.0-48-generic

done

ekzorchik@srv-bionic:~$ sudo reboot

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log

636:M 13 May 10:44:11.043 # Server initialized

636:M 13 May 10:44:11.044 * DB loaded from disk: 0.001 seconds

636:M 13 May 10:44:11.044 * Ready to accept connections

Проверяю работоспособность Redis подключение клиента к серверу:

ekzorchik@srv-bionic:~$ whereis redis-cli

redis-cli: /usr/bin/redis-cli /usr/share/man/man1/redis-cli.1.gz

ekzorchik@srv-bionic:~$ redis-cli

127.0.0.1:6379>

ekzorchik@srv-bionic:~$

Проверяю статус соединения:

127.0.0.1:6379> ping

PONG →

значит, соединение с сервером установлено

127.0.0.1:6379>

Проверяю, что отрабатывает установка ключей Redis, т. е. Есть статус OK:

ekzorchik@srv-bionic:~$ redis-cli

127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX] → при набирании команды set дальше отображается справка по искользованию

Проверяю, извлечение значения по ключу:

127.0.0.1:6379> set test "ekzorchik"

OK

127.0.0.1:6379> get key → где key это справка что нужно указать

127.0.0.1:6379> get test

"ekzorchik"

127.0.0.1:6379> если нажимать клавишу TAB то будет произведено подставление управляющих команд, к примеру APPEND, AUTH и т. к.

Чтобы покинуть подключение:

ekzorchik@srv-bionic:~$ redis-cli

127.0.0.1:6379> exit

127.0.0.1:6379> quit

127.0.0.1:6379> Сочетание клавиш Ctrl + C

Смотрим размер базы данных:

ekzorchik@srv-bionic:~$ sudo ls -l /var/lib/redis/

total 4

-rw-rw---- 1 redis redis 113 May 13 10:44 dump.rdb

Не лишним будет установка пароля для безопасности хранилища ключ=значение:

ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf

# requirepass foobared

requirepass 712mbddr@

ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status
redis.service | head -n5

Проверяю, как теперь будет выглядеть подключение клиентом, смотрю
справку на предмет ключей через которых буду производить авторизацию:

ekzorchik@srv-bionic:~$ redis-cli --help

-h <hostname> Server hostname (default: 127.0.0.1).

-p <port> Server port (default: 6379).

-a <password> Password to use when connecting to the server.

ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379 -a 712mbddr@

127.0.0.1:6379>

Если нужно чтобы к примеру можно было подключаться с определенной системы к Redis:

ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf

bind 127.0.0.1 172.33.33.2

ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status redis.service | head -n5

ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep :6379

tcp 0 0 172.33.33.2:6379 0.0.0.0:* LISTEN 1900/redis-server 1

tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1900/redis-server 1

ekzorchik@srv-bionic:~$ ss -nlt | grep :6379

LISTEN 0 128 172.33.33.2:6379 0.0.0.0:*

LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*

Проверяю подключение к базе с текущей системы:

ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> ping → команда проверки статуса

(error) NOAUTH Authentication required. → ошибка, я не авторизирован, а все дело в том, что я не указал ключ «-a»:

127.0.0.1:6379> quit

ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379 -a 712mbddr@

127.0.0.1:6379> ping

PONG → вот теперь все отлично я авторизован.

127.0.0.1:6379> quit

ekzorchik@srv-bionic:~$

Проверяю возможность подключения с удаленной системы, для этого устанавливаю Redis и опираясь на синтаксис инициализирую взаимодействие:

ekzorchik@srv-bionic2:~$ apt-cache search redis-tools

redis-tools - Persistent key-value database with network interface (client)

ekzorchik@srv-bionic2:~$ sudo apt-get install redis-tools -y

ekzorchik@srv-bionic2:~$ redis-cli -h 172.33.33.2 -p 6379 -a 712mbddr@

172.33.33.2:6379> ping

PONG

172.33.33.2:6379>

172.33.33.2:6379> keys * → отобразить все ключи

1) "test"

172.33.33.2:6379>

Итак я с удаленной системы подключился, но что я еще считаю важным, так это в обязательном порядке использовать брандмауэр, разберу как есть включить на первом сервере, т. е. 172.33.33.2:

ekzorchik@srv-bionic:~$ sudo apt-get install ufw -y

ekzorchik@srv-bionic:~$ sudo nano /etc/default/ufw

#Выключаю поддержку IPV6

IPV6=no

ekzorchik@srv-bionic:~$ sudo ufw enable

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

Дефолтный профиль должен быть таким:

ekzorchik@srv-bionic:~$ sudo ufw status verbose

Status: active

Logging: on (low)

Default: deny (incoming), allow (outgoing), disabled (routed)

New profiles: skip

Если нет, то приводим к дефолтному:

ekzorchik@srv-bionic:~$ sudo ufw default deny incoming

ekzorchik@srv-bionic:~$ sudo ufw default allow outgoing

ekzorchik@srv-bionic:~$ sudo ufw allow 22/tcp

ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.2 port 6379 from 172.33.33.0/24 proto tcp

ekzorchik@srv-bionic:~$ sudo ufw logging on

ekzorchik@srv-bionic:~$ sudo ufw reload

ekzorchik@srv-bionic:~$ sudo ufw status

Status: active

To Action From

-- ------ ----

22/tcp ALLOW Anywhere

172.33.33.2 6379/tcp ALLOW 172.33.33.0/24

Теперь к серверу где развернута база Redis в административных целях можно подключиться через SSH (port 22 proto tcp), а в целях использования базы Redis через дефолтный порт 6379/tcp:

ekzorchik@srv-bionic2:~$ redis-cli -h 172.33.33.2 -p 6379 -a 712mbddr@

172.33.33.2:6379> ping

PONG

172.33.33.2:6379> quit

ekzorchik@srv-bionic2:~$

Посмотрим что говорит сканер nmap при проверки хоста (172.33.33.2):

ekzorchik@srv-bionic2:~$ sudo apt-get install nmap -y

ekzorchik@srv-bionic2:~$ nmap -p 6379 172.33.33.2 --script redis-info -PN

Starting Nmap 7.60 ( https://nmap.org ) at 2019-05-13 10:28 MSK

Nmap scan report for 172.33.33.2

Host is up (0.00057s latency).

PORT STATE SERVICE

6379/tcp open redis

Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds

ekzorchik@srv-bionic2:~$

Пока на этом всё, не большое введение завершено. Но как правда использовать это в практических целях я пока не знаю. А нет я использую в паре OwnCloud 10 + Redis вместо того что по дефолту. С уважением автор блога Олло Александр aka ekzorchik.