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, для которых задан expirevolatile-lfu
— удаляет ключи по алгоритму LFU, для которых задан expirevolatile-random
— удаляет случайные ключи, для которых задан expireallkeys-lru
— удаляет любые ключи по алгоритму LRU, независимо от expireallkeys-lfu
— удаляет любые ключи по алгоритму LFU, независимо от expireallkeys-random
— удаляет случайные ключи, независимо от expirevolatile-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
и восстановит состояние на этот момент времени.
Для восстановления на другой момент времени нужно остановить сервер, удалить текущий файл /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)
Упорядоченное множество — это упорядоченная коллекция уникальных элементов.
- PostgreSQL. Установка и настройка
- Dante. Установка и настройка прокси-сервера
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
Поиск: База данных • Клиент • Конфигурация • Настройка • Сервер • Установка