Добавить в корзинуПозвонить
Найти в Дзене
Linux | Network | DevOps

Redis на Linux: установка, настройка, нюансы

Redis — система управления базами данных, которая хранит данные в
формате «ключ-значение» — уникальному ключу в БД соответствует некоторое значение. Данные в этой базе данных хранятся в оперативной памяти, благодаря чему запросы обрабатываются очень быстро. Здесь все просто — нужно установить пакет redis-server $ sudo apt install redis-server После установки проверим работу сервера $ systemctl status redis.service
redis-server.service - Advanced key-value store
Loaded: loaded (/usr/lib/systemd/system/redis-server.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-07-26 11:09:01 UTC; 19s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 21906 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 2276)
Memory: 3.3M (peak: 3.5M)
CPU: 119ms
CGroup: /system.slice/redis-server.service
└─21906 "/usr/bin/redis-server 127.0.0.1:6379"
июл 26 11:09:01 ubuntu-s
Оглавление

Redis — система управления базами данных, которая хранит данные в
формате «ключ-значение» — уникальному ключу в БД соответствует некоторое значение. Данные в этой базе данных хранятся в оперативной памяти, благодаря чему запросы обрабатываются очень быстро.

Установка сервера

Здесь все просто — нужно установить пакет redis-server

$ sudo apt install redis-server

После установки проверим работу сервера

$ systemctl status redis.service
redis-server.service - Advanced key-value store
Loaded: loaded (/usr/lib/systemd/system/redis-server.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-07-26 11:09:01 UTC; 19s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 21906 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 2276)
Memory: 3.3M (peak: 3.5M)
CPU: 119ms
CGroup: /system.slice/redis-server.service
└─21906 "/usr/bin/redis-server 127.0.0.1:6379"

июл 26 11:09:01 ubuntu-server systemd[1]: Starting redis-server.service - Advanced key-value store...
июл 26 11:09:01 ubuntu-server systemd[1]: Started redis-server.service - Advanced key-value store.

Файл конфигурации

Файл конфигурации Redis — это /etc/redis/redis.conf. Давайте рассмотрим опции, которые используются наиболее часто.

Опция maxmemory

Эта опция задает ограничение использования оперативной памяти для
хранения данных. Значение по умолчанию — ноль, что означает отсутствие
ограничения. Самое простое решение для выбора значения опции —
использовать 90% свободной памяти. Нужно выполнить несколько замеров с
помощью команды free. Команда может выдавать значения в килобайтах, мегабайтах, гигабайтах, кибибайтах, мебибайтах, гигибайтах.

$ free -m # в мебибайтах
total used free shared buff/cache available
Mem: 1968 401 665 0 1093 1566
Swap: 2047 0 2047

Значение опции тоже можно задавать в этих единицах измерения или просто в байтах

# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
maxmemory 600mb

Опция maxmemory-policy

Опция отвечает за то, как вытеснять из памяти ключи при достижении maxmemory, значение по умолчанию — noeviction.

  • noeviction — не удаляет ключи, просто возвращает ошибку при операциях записи
  • volatile-lru — удаляет ключи по алгоритму LRU, для которых задан expire
  • volatile-lfu — удаляет ключи по алгоритму LFU, для которых задан expire
  • volatile-random — удаляет случайные ключи, для которых задан expire
  • allkeys-lru — удаляет любые ключи по алгоритму LRU, независимо от expire
  • allkeys-lfu — удаляет любые ключи по алгоритму LFU, независимо от expire
  • allkeys-random — удаляет случайные ключи, независимо от expire
  • volatile-ttl — удаляет ключи, у которых истекает время жизни

Алгоритм LRU основан на предположении, что если к ключу недавно
обращались, существует более высокая вероятность повторного доступа к
нему в ближайшем будущем, поскольку обычно паттерны доступа к ключам не меняются резко. Таким образом, алгоритм LRU удаляет наименее
востребованные в последнее время ключи.

Алгоритм LFU основан на предположении, что ключи, которые имеют
максимальную вероятность доступа в будущем — это ключи, к которым
наиболее часто обращаются в целом, а не те, к которым часто обращались в
последнее время. Таким образом, алгоритм LFU удаляет наименее
востребованные за все время время ключи.

Если для всех ключей задается время жизни, то подходящим значением будет volatile-lru или volatile-lfu. Если есть ключи без времени жизни, то подходящим значением будет allkeys-lru или allkeys-lfu — чтобы не хранить ключи без expire вечно.

# Удалять любые ключи, которые за последний период использовались редко
maxmemory-policy allkeys-lru

Опция maxclients

Максимальное количество клиентов, которые могут быть подключены к серверу одновременно. Значение по умолчанию равно 10000.

# Максимальное кол-во клиентов, которые могут быть подключены к серверу одновременно
maxclients 10000

При увеличении значения maxclients возможна ошибка,
связанная с ограничением на кол-во открытых файлов. Лимит
устанавливается на уровне ядра операционной системы и на уровне
отдельного пользователя. Ограничение на уровне ядра задается параметром fs.file-max, это можно изменить в файле конфигурации /etc/sysctl.conf. Ограничение на уровне пользователя можно изменить в файле конфигурации /etc/security/limits.conf.

You requested maxclients of 10000 requiring at least 10032 max file descriptors. Redis can't
set maximum open files to 10032 because of OS error: Operation not permitted. Current maximum
open files is 4096. maxclients has been reduced to 4064 to compensate forlow ulimit. If you
need higher maxclients increase 'ulimit -n'.

Если для управления сервером Redis используется подсистема Systemd — нужно отредактировать файл юнита redis.service, чтобы изменить максимальное кол-во открытых файлов. Значение нужно увеличить как минимум до maxclients плюс еще 32 на внутренние нужды Redis.

$ sudo systemctl edit redis.service

# Editing /etc/systemd/system/redis-server.service.d/override.conf
[Service]
LimitNOFILE=10032

$ sudo systemctl daemon-reload
$ sudo systemctl restart redis.service

Скорее всего, в этом не будет необходимости, потому что после установки сервера LimitNOFILE имеет значение 65535 — этого достаточно даже для высоких нагрузок. Проверить значение LimitNOFILE перед редактированием файла юнита — можно с помощью следующей команды.

$ systemctl show redis.service | grep LimitNOFILE
LimitNOFILE=65535
LimitNOFILESoft=65535

Опция bind

Опция задает, какие сетевые интерфейсы прослушивать на предмет
соединений от клиентов. По умолчанию прослушиваются все доступные
сетевые интерфейсы. Если перед сетевым интерфейсом есть дефис — сервер
не будет выдавать ошибку при запуске, если этот интерфейс недоступен.

# Такое значение используется по умолчанию, если файл конфигурации вообще не содержит опции bind
# bind * -::*

# Прослушивать только интерфейс обратной петли, соединения от клиентов возможны только с той машины,
# где запущен сам сервер. Если протокол IPv6 недоступен — не выдавать ошибку при запуске сервера.
bind 127.0.0.1 -::1

# Прослушивать соединения на интерфейсе обратной петли и на интерфейсе с ip-адресом 192.168.100.2
bind 127.0.0.1 192.168.100.2

Опция port

Опция задает, какой порт прослушивать на предмет соединений от клиентов,
по умолчанию — 6379. Если установлено нулевое значение — сервер не
будет прослушивать TCP-сокет.

# Какой порт прослушивать на предмет соединений от клиентов
port 6379

Опция timeout

По умолчанию опция установлена в ноль — это означает, что сервер не
будет закрывать соединения даже после долгого простоя. Такая ситуация
может возникнуть из-за неправильной конфигурации клиента, который не
закрывает соединения. Это может привести к большому количеству открытых
соединений и невозможности подключиться к серверу после достижении maxclients.

# Закрывать соединение после 3 секунд отсутствия активности клиента
timeout 3

Опция tcp-keepalive

Позволяет использовать одно tcp-соединение для выполнения нескольких
запросов к серверу. Нулевое значение означает, что для каждого запроса
данных от сервера, нужно открывать новое соединение.

# У клиента будет 5 секунд после открытия соединения для выполнения всех запросов, после чего# сервер закроет соединение. Для новых запросов клиент должен будет открыть новое соединение.
tcp-keepalive 5

Опция tcp-backlog

Максимальный размер очереди установленных tcp-соединений, которые ожидают обработки сервером.

# Максимальный размер очереди установленных tcp-соединений, которые ожидают обработки сервером
tcp-backlog 2048

При этом у операционной системы есть собственные лимиты net.ipv4.tcp_max_syn_backlog и net.core.somaxconn, которые задают размеры очереди соединений. Проверить текущие лимиты можно с помощью команды sysctl.

$ sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 128
$ sysctl net.core.somaxconn
net.core.somaxconn = 1024

Чтобы изменить значения net.ipv4.tcp_max_syn_backlog и net.core.somaxconn — нужно редактировать файл /etc/sysctl.conf

$ sudo nano /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 256
net.ipv4.tcp_synack_retries = 0
net.core.somaxconn = 2048

$ sudo sysctl -p

Параметр ядра net.ipv4.tcp_max_syn_backlog задает размер очереди соединений (backlog queue), которые еще не до конца установлены. Сервер получил SYN от клиента, отправил SYN+ACK, но еще не получил в ответ ACK.

Параметр ядра net.core.somaxconn задает размер очереди соединений (accept queue), которые уже установлены, но пока не приняты сервером. Сервер получил SYN от клиента, отправил SYN+ACK, и уже получил в ответ ACK.

Опция tcp-backlog задает значение параметра backlog при вызове функции listen().
Этот параметр задает максимальное количество полностью установленных
соединений, ожидающих, пока они будут приняты. Если значение tcp-backlog превышает значение net.core.somaxconn — будет выдано предупреждение. А значение параметра backlog при вызове функции listen() — урезано до net.core.somaxconn.

The TCP backlog setting of 2048 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 1024

Если сервер получает SYN, отправляет SYN+ACK, но не получает ACK — то тайм-аут повторной отправки SYN+ACK вычисляется по экспоненте. Количество повторных попыток отправки SYN+ACK задается параметром ядра net.ipv4.tcp_synack_retries
(по умолчанию равно 5). Повторные попытки будут через следующие
интервалы — 1с, 3с, 7с, 15с, 31с. При высоких нагрузках есть смысл
установить net.ipv4.tcp_synack_retries в ноль (не предпринимать повторных попыток) или единицу (предпринять только одну попытку).

Каждому соединению требуется файловый декскриптор. Максимальное кол-во файловых дескрипторов задается параметром ядра fs.file-max. По умолчанию fs.file-max имеет достаточно большое значение, так что нет необходимости его изменять.

Опция unixsocket

Путь к файлу unix-сокета для прослушивания соединений от клиентов. По
умолчанию unix-сокет не прослушивается, нужно указать это явно. Сервер
может прослушивать tcp-сокет и unix-сокет одновременно — одно другому не
мешает.

# Путь к файлу unix-сокета для прослушивания соединений от клиентов
# unixsocket /run/redis/redis-server.sock
# unixsocketperm 700

Опция save

Опция задает условия, при которых данные будут записываться на диск. Опция save принимает два значения — количество секунд и количество изменений. Если за указанное количество секунд происходит указанное количество изменений, то данные будут записаны на диск. Условия в виде кол-ва секунд и кол-ва изменений могут быть заданы несколько раз. Другой
вариант задать несколько условий — использовать опцию save несколько раз.

# Чтобы запретить сбрасывать данные на диск — нужно установить значение ""
save ""

# Сохранить данные на диск, если за 3600 секунд будет хотя бы 10 изменений
save 3600 10

По умолчанию заданы три условия сброса данных на диск

# Unless specified otherwise, by default Redis will save the DB:
# * After 3600 seconds (an hour) if at least 1 change was performed
# * After 300 seconds (5 minutes) if at least 100 changes were performed
# * After 60 seconds if at least 10000 changes were performed
# save 3600 1 300 100 60 10000

Опция appendonly

Опция save задает условия записи на диск полного дампа базы данных в формате RDB. Опция appendonly разрешает ведение журнала всех команд в формате AOF, которые изменяют данные. Это более надежный способ восстановления данных после аварии, чем дамп в формате RDB.

# Разрешить запись в журнал всех команд, которые изменяют данные
appendonly yes

Опция protected-mode

Опция включает защищенный режим. Это значит, что если для пользователя
по умолчанию не установлен пароль, то сервер принимает только локальные
соединения (IPv4 адрес 127.0.0.1 и IPv6 адрес ::1) или через unix-сокет.

protected-mode yes

Опции безопасности

По умолчанию блокируется изменение некоторых опций конфигурации,
выполнение потенциально опасных команд и загрузка модулей. Можно все это разрешить для локальных соединений или для любых соединений (не
рекомендуется).

# no - Block for any connection (remain immutable)
# yes - Allow for any connection (no protection)
# local - Allow only for local connections. Ones originating from the
# IPv4 address (127.0.0.1), IPv6 address (::1) or Unix domain sockets.
#
# enable-protected-configs no
# enable-debug-command no
# enable-module-command no

Опция logfile

Имя файла для записи логов сервера.

# Имя файла для записи логов сервера
logfile /var/log/redis/redis-server.log

Ротацию логов дополнительно не нужно настраивать — после установки сервера уже существует файл конфигурации logrotate.

$ cat /etc/logrotate.d/redis-server
/var/log/redis/redis-server*.log {
weekly
missingok
rotate 12
compress
notifempty
delaycompress
}

Опция loglevel

Уровень подробности при записи в лог, может принимать значения debug, verbose, notice, warning.

# Уровень подробности при записи в лог
loglevel warning

Опция requirepass

Позволяет установить пароль для пользователя по умолчанию. В настоящее
время поддерживается с целью обратной совместимости. Сейчас
рекомендуется использовать ACL (Access Control List).

# Пароль для пользователя по умолчанию
requirepass qwerty123456

Для получения надежного пароля можно использовать команду

$ openssl rand 60 | openssl base64 -A
2nYp+gr2FZJaO0lxsdq/tLD29FGz2TJquiWN+HJEqY3QpKALIo4820J0i2+UUSGjrYEL2sGy+mIYn8+K

Опция aclfile

Путь к файлу ACL (Access Control List) — файл содержит имена пользователей с паролями + права доступа.

# Имя файла ACL (Access Control List)
aclfile /etc/redis/acl.conf

Пример файла ACL (Access Control List) — файл содержит имена пользователей с паролями + права доступа.

user admin-user on >qwerty allkeys +@all -@dangerous
user cache-user on >123456 resetkeys ~cache:* +get +set

Проверка конфигурации

Чтобы просмотреть текущие настройки сервера — можно использовать команду CONFIG GET. Команда принимает один аргумент — это либо точное название опции, которая используется в файле redis.conf, либо шаблон поиска.

$ redis-cli
> CONFIG GET tcp*
1) "tcp-backlog"
2) "511"
3) "tcp-keepalive"
4) "300"

Команда CONFIG SET позволяет изменить настройки во время
выполнения без перезапуска сервиса. Команда не изменяет конфигурации
сервера навсегда — только для текущей сессии. Чтобы изменить файл redis.conf после выполнения команды CONFIG SET и сделать конфигурацию постоянной — можно использовать команду CONFIG REWRITE. Эта команда делает все возможное, чтобы сохранить комментарии и общую структуру файла redis.conf, внося лишь минимальные изменения, соответствующие настройкам, которые в настоящее время используются сервером.

RDB и AOF

Redis хранит данные в оперативной памяти, но при необходимости может
сбрасывать их на диск. Для этого используются два мехнизма — RDB (Redis
Database Backup) и AOF (Append Only File). Каждый имеет свои
преимущества и недостатки, выбор правильного варианта зависит от
конкретных требований приложения.

RDB (Redis Database Backup)

RDB — это запись в файл всех данных на определенный момент времени. Файл быстро сохраняется и загружается, что делает RDP отличным вариантом для аварийного восстановления. Поскольку RDB делает снимки данных с
заданным интервалом, все данные, записанные после последнего снимка и до момента сбоя — будут утеряны. Во время создания RDB-файла — возрастает нагрузка на диск.

# Создание снимка каждый час, если было хоть какое-нибудь изменение данных
save 3600 1
# Директория сохранения снимка всех данных на определенный момент времени
dir /var/lib/redis
# Имя файла внутри директории dir (см. выше) для сохранения снимка данных
dbfilename dump.rdb
# При ошибке создания снимка, не запрещать операции на запись от клиентов
stop-writes-on-bgsave-error no

Файл дампа можно копировать в любое время без остановки работы сервера.
RDB файл никогда не изменяется после того, как был создан. Пока идет
процесс создания снимка — используется временное имя файла. И только
когда все готово — атомарно переименовывается в свое конечное место
назначения.

Для восстановления базы данных нужно просто перезапустить сервер. При запуске Redis считает файл /var/lib/redis/dump.rdb и восстановит состояние на этот момент времени.

Если в файле конфигурации разрешено использовать одновременно RDB и AOF — при перезапуске сервера будет использован механизм AOF для
восстановления данных. Чтобы восстановить данные с использованием RDB — нужно остановить сервер, запретить AOF в файле конфигурации, снова
запустить сервер.

Для восстановления на другой момент времени нужно остановить сервер, удалить текущий файл /var/lib/redis/dump.rdb, скопировать RDB файл из резервной копии в директорию /var/lib/redis под именем dump.rdb, назначить владельцем файла redis:redis, выставить права на него 660 — после чего снова запустить сервер.

Снимки можно создавать не только автоматически при выполнении условий, но и вручную — с помощью команды BGSAVE.

Команда BGSAVE делает форк текущего процесса и в этом форке
данные записываются на диск. Основной поток не блокируется и запись на
диск происходит асинхронно. Проблема в том, что в UNIX-системах при
вызове fork(), в дочерний процесс так же копируется
содержимое памяти, которую использует родительский процесс. Допустим,
если Redis в текущий момент времени занимает 2Gb памяти, а в системе
остался только 1Gb свободной памяти, то при выполнении команды BGSAVE возможна следующая ошибка.

[18696] 04 Aug 12:26:54 # Can't save in background: fork: Cannot allocate memory

В современных системах при копировании памяти для форков используется метод Copy on Write.
Память копируется только тогда, когда происходит запись в
соответствующий участок памяти. Redis делает форк процесса лишь для
того, чтобы сохранить данные асинхронно, этот форк их никак не изменяет.
Это значит, что можно установить системный параметр vm.overcommit_memory в единицу. Этот параметр отвечает за возможность выделения большего объёма памяти, чем реально доступно.

$ sudo nano /etc/sysctl.conf

vm.overcommit_memory = 1

$ sudo sysctl -p

Если этого не сделать, в логах будут сообщения, которые говорят о необходимости изменить настройку операционной системы

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under
low memory condition. Being disabled, it can can also cause failures without low memory condition, see
https://github.com/jemalloc/jemalloc/issues/1328. 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.

AOF (Append Only File)

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

# Разрешить запись в журнал всех команд, которые изменяют данные
appendonly yes
# Имя файла и имя директории для сохранения журнала всех команд
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

При использовании AOF — есть базовый файл, содержащий полный снимок
данных в формате AOF или RDB. И есть инкрементные файлы, которые
содержат данные, измененные с момента создания полного снимка. Кроме
того, существует файл манифеста, который содержит информацию, как
применять все созданные файлы, чтобы восстановить базу данных.

  • appendonly.aof.1.base.rdb — базовый файл
  • appendonly.aof.1.incr.aof — инкрементный файл
  • appendonly.aof.2.incr.aof — инкрементный файл
  • appendonly.aof.manifest — файл манифеста

Как уже упоминалось выше, можно настроить синхронную запись данных
журнала AOF на диск — для уменьшения риска потери данных. За это
отвечает опция appendfsync, которая может принимать значения always, everysec и no.

appendfsync always # самый безопасный, но самый медленный
appendfsync everysec # оптимальный баланс (default)
appendfsync no # самый быстрый, но наименее безопасный

Поскольку инкрементные файлы AOF растут быстро, то время от времени
запускается процесс перезаписи. Другими словами, создается новый базовый
файл снимка данных и начинается запись изменений в новые инкрементные
файлы с момента создания этого снимка.

# Очередной процесс перезаписи начнется, когда текущий размер AOF-файлов превысит на 100% тот
# размер AOF-файлов, который был в момент времени сразу после перезаписи. В момент времени
# сразу после перезаписи размер AOF-файлов минимальный и после этого может вырасти в два раза
# (на 100%) — после чего будет запущен новый процесс перезаписи.
auto-aof-rewrite-percentage 100
# Минимальный размер файлов, когда возможна перезапись. Процесс перезаписи не будет запущен,
# пока размер файлов не достигнет этого значения, даже если опция auto-aof-rewrite-percentage
# говорит, что уже пора начинать перезапись.
auto-aof-rewrite-min-size 64mb

Процесс перезаписи может запускаться не только автоматически, но и вручную — с помощью команды BGREWRITEAOF.

Как уже упоминалось выше — базовый файл полного снимка данных может быть
в формате AOF или RDB. Использование формата RDB — быстрее и
эффективнее. Формат AOF рекомендуется использовать только в целях
обратной совместимости.

# Использовать формат RDB для базового файла полного снимка данных
aof-use-rdb-preamble yes

Для восстановления базы данных нужно просто перезапустить сервер. При
запуске Redis считает файл манифеста AOF и восстановит самое последнее
состояние. Если в файле конфигурации разрешено использовать одновременно RDB и AOF — при восстановлении предпочтение отдается AOF. Так что не требуется отключать RDB, чтобы запустилось восстановление AOF.

ACL (Access Control List)

Если к серверу имеет доступ несколько разных пользователей — есть смысл
разграничить их права доступа. В ACL можно указать к каким командам или к
каким ключам у пользователя есть доступ.

Например, давайте создадим нового пользователя

> ACL SETUSER test-user
OK

Посмотрим список пользователей и права

> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user test-user off resetchannels -@all"

Пользователь default активен (on), может подключаться без пароля (nopass), имеет доступ ко всем возможным ключам (~*) и каналам pub/sub (&*), а также возможность выполнения всех команд (+@all).

Разрешить или запретить выполнение команд

  • +command — разрешить команду. Можно разрешить подкоманду с помощью |, например +config|get.
  • -command — запретить команду. Можно запретить подкоманду с помощью |, например -config|set.
  • +@category — разрешить команды указанной категории, например +@admin.
  • -@category — запретить команды указанной категории, например -@dangerous.

Список всех категорий можно посмотреть с помощью команды ACL CAT, список команд, которые входят в категорию — с помощью команды ACL CAT name.

Redis pub/sub реализует систему обмена сообщениями в
реальном времени, где издатели публикуют сообщения в канале (PUBLISH), а
несколько клиентов могут подписаться на этот канал (SUBSCRIBE).
Пользователь default имеет доступ к любым каналам, а вот пользователь test-user — нет. Директива resetchannels блокирует доступ ко всем каналам. Директива allchannels разрешает доступ ко всем каналам.

Разрешить или запретить доступ к ключам по шаблону

  • ~pattern — разрешить доступ на чтение и запись ключей, соответствующих шаблону pattern
  • %R~pattern — разрешить доступ на чтение ключей, соответствующих шаблону pattern
  • %W~pattern — разрешить доступ на запись ключей, соответствующих шаблону pattern
  • %RW~pattern — доступ на чтение и запись ключей по шаблону pattern, псевдоним для ~pattern

Директива resetkeys очищает список разрешенных шаблонов ключей. Директива allkeys является псевдонимом для ~*.

По умолчанию для пользователя test-user не задан пароль, он
не имеет доступа ни к командам, ни к каким-либо ключам. Строго говоря,
такой пользователь сейчас абсолютно бесполезен.

> ACL SETUSER test-user on >qwerty resetchannels &test-channel resetkeys %R~foo:* +@all -@dangerous
OK
> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user test-user on #65e84b...2337c5 %R~foo:* resetchannels &test-channel +@all -@dangerous"

Теперь пользователь test-user активен, для него установлен пароль qwerty, есть доступ к каналу test-channel, есть доступ на чтение ключей с префиксом foo:, есть возможность выполнять любые команды, кроме опасных.

> ACL WHOAMI # сейчас работаем под пользователем default
"default"
> SET foo:bar "some value"
OK
> SET baz:bar "other value"
OK
> AUTH test-user qwerty # дальше работаем под пользователем test-user
OK
> ACL WHOAMI
"test-user"
> GET foo:bar # можно читать ключи с префиксом foo:
"some value"
> GET baz:bar # но нельзя читать ключи с другим префиксом
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> SET foo:bar "new value" # доступ только на чтение, нельзя записывать
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> AUTH default "" # дальше работаем под пользователем default
OK
> ACL WHOAMI
"default"

Управление паролями пользователя

  • >password — добавить этот пароль в список допустимых, снять флаг nopass
  • <password — удалить этот пароль из списка допустимых
  • #hash — добавить это значение хэша SHA-256 в список допустимых паролей
  • !hash — удалить это значение хэша SHA-256 из списка допустимых паролей
  • nopass — удалить все пароли для пользователя, установить флаг nopass
  • resetpass — удалить все пароли для пользователя, сбросить флаг nopass

Консольный клиент

Консольный клиент позволяет подключиться к серверу и выполнять команды. При подключении можно указать хост (по умолчанию 127.0.0.1), порт (по умолчанию 6379), unix-сокет (переопределяет хост и порт), имя пользователя и пароль.

$ redis-cli --help
redis-cli 7.0.15

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1).
-p <port> Server port (default: 6379).
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server.
You can also use the REDISCLI_AUTH environment
variable to pass this password more safely
(if both are used, this argument takes precedence).
--user <username> Used to send ACL style 'AUTH username pass'. Needs -a.
--pass <password> Alias of -a for consistency with the new --user option.
..........

Утилита redis-benchmark

Позволяет провести нагрузочное тестирование сервера. При запуске нужно указать хост (по умолчанию 127.0.0.1), порт (по умолчанию 6379), unix-сокет (переопределяет хост и порт), имя пользователя и пароль. Опция -c задает кол-во клиентов, одновременно выполняющих запросы к серверу (по умолчанию 50). Опция -n устанавливает общее кол-во запросов к серверу за время тестирования (по умолчанию 100000). Опция -d — это размер данных в байтах для операций SET и GET (по умолчанию 3).

Количество операций в секунду (requests per second), которые способен выполнить сервер

$ redis-benchmark -q # все опции по умолчанию, только итоговые данные, без подробностей
PING_INLINE: 37341.30 requests per second, p50=0.855 msec
PING_MBULK: 36284.47 requests per second, p50=0.855 msec
SET: 31416.90 requests per second, p50=1.023 msec
GET: 37678.97 requests per second, p50=0.855 msec
INCR: 34818.94 requests per second, p50=0.951 msec
LPUSH: 33749.58 requests per second, p50=0.999 msec
RPUSH: 34317.09 requests per second, p50=0.983 msec
LPOP: 33795.20 requests per second, p50=0.991 msec
RPOP: 33647.38 requests per second, p50=0.983 msec
SADD: 37133.31 requests per second, p50=0.879 msec
HSET: 32959.79 requests per second, p50=1.031 msec
SPOP: 37936.27 requests per second, p50=0.855 msec
ZADD: 36205.65 requests per second, p50=0.903 msec
ZPOPMIN: 38124.29 requests per second, p50=0.847 msec
LPUSH (needed to benchmark LRANGE): 33523.30 requests per second, p50=0.999 msec
LRANGE_100 (first 100 elements): 13827.43 requests per second, p50=2.463 msec
LRANGE_300 (first 300 elements): 4483.30 requests per second, p50=5.935 msec
LRANGE_500 (first 500 elements): 3516.17 requests per second, p50=8.599 msec
LRANGE_600 (first 600 elements): 3256.48 requests per second, p50=9.807 msec
MSET (10 keys): 21997.36 requests per second, p50=1.839 msec

$ redis-benchmark -t set,get -q # итоговые данные по операциям SET и GET, без подробностей
SET: 33670.04 requests per second, p50=0.999 msec
GET: 37878.79 requests per second, p50=0.863 msec

Номер базы данных

Экземпляр Redis из коробки поддерживает 16 логических баз данных. Эти
базы данных отделены друг от друга — то есть, выполнение команды в одной
базе данных не влияет на данные, хранящиеся в других базах. Базы данных
Redis пронумерованы от 0 до 15. По умолчанию подключение происходит к
базе данных с нулевым номером. Изменить базу данных можно с помощью
команды SELECT.

> SELECT 10
OK

После выбора другой базы данных — ее номер будет отражаться в префиксе строки redis-cli в квадратных скобках.

Команда INFO

Команда выводит на консоль обширную информацию, разделенную на группы — Server, Clients, Memory, Persistence, Stat, Replication, CPU, Modules, Errorstats, Cluster, Keyspace.

$ redis-cli INFO
### Server
redis_version:7.0.15
..........
### Clients
connected_clients:1
..........
### Memory
used_memory:966080
..........

Можно получить данные только одного блока

$ redis-cli INFO Memory
### Memory
used_memory:964472
used_memory_human:941.87K
used_memory_rss:14286848
used_memory_rss_human:13.62M
used_memory_peak:1103080
used_memory_peak_human:1.05M
used_memory_peak_perc:87.43%
used_memory_overhead:876136
used_memory_startup:875936
used_memory_dataset:88336
used_memory_dataset_perc:99.77%
..........

Проверка задержки

Чтобы получить среднее время, которое требуется для получения ответа на запрос — запускаем клиент с опцией latency. При этом выполняется команда PING и фиксируется время, когда был получен ответ PONG.

$ redis-cli --latency
min: 0, max: 9, avg: 0.11 (11477 samples)

Эта команда будет работать бесконечно, остановить выполнение можно с помощью CTRL + C. Чтобы отследить задержку, выполняя запросы в течение 15 секунд (а потом еще и еще) — запускаем клиент с опцией latency-history.

$ redis-cli --latency-history
min: 0, max: 2, avg: 0.11 (1457 samples) -- 15.01 seconds range
min: 0, max: 2, avg: 0.11 (1453 samples) -- 15.01 seconds range
min: 0, max: 2, avg: 0.10 (1460 samples) -- 15.00 seconds range
min: 0, max: 2, avg: 0.12 (1460 samples) -- 15.01 seconds range
min: 0, max: 2, avg: 0.12 (1460 samples) -- 15.00 seconds range

Типы данных

Ключ

Ключ — уникальный идентификатора значения, которое с ним связано.
Значение может быть разным — целочисленное, строковое и даже объектом,
содержащими другие вложенные значения.

Строка (string)

Строка является базовым типом данных, который содержит в себе все остальные данные. Максимально допустимый размер — 512 МБ.

Список (list)

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

Хеш-таблицы (hash)

В качестве качестве значения ключа можно использовать пару ключ-значение. Что по сути будет почти аналогией объекта в JavaScript или словаря в Python.

Множество (set)

Множество — это неупорядоченная коллекция уникальных элементов.

Упорядоченное множество (sorted set)

Упорядоченное множество — это упорядоченная коллекция уникальных элементов.

Обсудить эту статью можно в Телеграм канале: https://t.me/linautonet