Redis. Установка и настройка

29.07.2024

Теги: БазаДанныхКлиентКонфигурацияНастройкаСерверУстановка

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
# Минимальный размер AOF-файлов, когда возможна перезапись. Процесс перезаписи не будет запущен,
# пока размер файлов не достигнет этого значения, даже если опция 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)

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

Поиск: База данных • Клиент • Конфигурация • Настройка • Сервер • Установка

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.