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— удалить все пароли для пользователя, установить флагnopassresetpass— удалить все пароли для пользователя, сбросить флаг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. Установка и настройка
- Fail2Ban. Установка и настройка
- 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
Поиск: База данных • Клиент • Конфигурация • Настройка • Сервер • Установка