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