Мы используем встроенный в Redis инструмент командной строки redis-cli каждый день. Со временем мы подумали, что это простая интерактивная программа ручного управления структурой данных Redis, но мощные функции, стоящие за ней, могут быть неслыханными для большинства студентов. В этом разделе давайте рассмотрим эти малоизвестные интересные способы использования.
выполнить одну команду
При доступе к серверу Redis мы обычно используем redis-cli для входа в интерактивный режим, а затем читаем и пишем сервер, задавая вопросы и отвечая на них.В этом случае мы используем его «интерактивный режим». Существует еще один «прямой режим», который выполняет команды и получает вывод, передавая аргументы команды непосредственно в redis-cli.
$ redis-cli incrby foo 5
(integer) 5
$ redis-cli incrby foo 5
(integer) 10
Вы также можете перенаправить вывод во внешний файл, если вывод большой.
$ redis-cli info > info.txt
$ wc -l info.txt
120 info.txt
Сервер, на который указывает приведенная выше команда, является адресом сервера по умолчанию.Если вы хотите указать на определенный сервер, вы можете сделать это
// -n 2 表示使用第2个库,相当于 select 2
$ redis-cli -h localhost -p 6379 -n 2 ping
PONG
Пакетная команда исполнения
В обычном процессе онлайн-разработки нам иногда приходится вручную создавать данные, а затем импортировать их в Redis. Обычно для этого мы пишем сценарии. Но есть и другой, более удобный способ — использовать Redis-Cli напрямую для пакетного выполнения последовательности инструкций.
$ cat cmds.txt
set foo1 bar1
set foo2 bar2
set foo3 bar3
......
$ cat cmds.txt | redis-cli
OK
OK
OK
...
Приведенная выше команда использует конвейер Unix для подключения стандартного вывода команды cat к стандартному вводу redis-cli. Фактически, вы также можете напрямую использовать перенаправление ввода для пакетного выполнения инструкций.
$ redis-cli < cmds.txt
OK
OK
OK
...
установить многострочную строку
Если строка состоит из нескольких строк и вы хотите передать ее команде set, как это делает redis-cli? Вы можете использовать параметр -x, который использует содержимое стандартного ввода в качестве последнего аргумента.
$ cat str.txt
Ernest Hemingway once wrote,
"The world is a fine place and worth fighting for."
I agree with the second part.
$ redis-cli -x set foo < str.txt
OK
$ redis-cli get foo
"Ernest Hemingway once wrote,\n\"The world is a fine place and worth fighting for.\"\nI agree with the second part.\n"
Повторное выполнение инструкций
Redis-cli также поддерживает повторное выполнение инструкций несколько раз, и между выполнением каждой инструкции устанавливается интервал, чтобы можно было наблюдать вывод содержимого инструкции с течением времени.
// 间隔1s,执行5次,观察qps的变化
$ redis-cli -r 5 -i 1 info | grep ops
instantaneous_ops_per_sec:43469
instantaneous_ops_per_sec:47460
instantaneous_ops_per_sec:47699
instantaneous_ops_per_sec:46434
instantaneous_ops_per_sec:47216
Если для счетчика установлено значение -1, он повторяется бесконечное количество раз и выполняется навсегда. Если параметр -i не указан, интервала нет, и выполнение повторяется непрерывно. Инструкции также могут выполняться многократно в интерактивном режиме, что странно по форме и увеличивает количество раз перед выполнением инструкции.
127.0.0.1:6379> 5 ping
PONG
PONG
PONG
PONG
PONG
# 下面的指令很可怕,你的屏幕要愤怒了
127.0.0.1:6379> 10000 info
.......
Экспорт CSV.
Redis-cli не может экспортировать содержимое всей библиотеки в csv за один раз, но может экспортировать вывод одной инструкции в формат csv.
$ redis-cli rpush lfoo a b c d e f g
(integer) 7
$ redis-cli --csv lrange lfoo 0 -1
"a","b","c","d","e","f","g"
$ redis-cli hmset hfoo a 1 b 2 c 3 d 4
OK
$ redis-cli --csv hgetall hfoo
"a","1","b","2","c","3","d","4"
Конечно, эта функция экспорта относительно слабая, просто набор строк, разделенных запятыми. Однако вы можете комбинировать пакетное выполнение команд, чтобы увидеть эффект экспорта нескольких команд.
$ redis-cli --csv -r 5 hgetall hfoo
"a","1","b","2","c","3","d","4"
"a","1","b","2","c","3","d","4"
"a","1","b","2","c","3","d","4"
"a","1","b","2","c","3","d","4"
"a","1","b","2","c","3","d","4"
Увидев это, читатели должны понять, что действие параметра --csv заключается в однократном преобразовании вывода, разделенном запятыми, и все.
выполнить луа-скрипт
В разделе сценария lua мы используем инструкцию eval для выполнения строки сценария Каждый раз содержимое сценария сжимается в однострочную строку, а затем вызывается инструкция eval, которая очень громоздка и плохо читается. Redis-cli учитывает это, он может напрямую выполнять файлы сценариев.
127.0.0.1:6379> eval "return redis.pcall('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])" 2 foo1 foo2 bar1 bar2
OK
127.0.0.1:6379> eval "return redis.pcall('mget', KEYS[1], KEYS[2])" 2 foo1 foo2
1) "bar1"
2) "bar2"
Далее выполняем приведенную выше команду в виде скрипта.Форма параметров отличается.Запятая должна использоваться для разделения KEY и ARGV, и нет необходимости указывать количество параметров KEY.
$ cat mset.txt
return redis.pcall('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])
$ cat mget.txt
return redis.pcall('mget', KEYS[1], KEYS[2])
$ redis-cli --eval mset.txt foo1 foo2 , bar1 bar2
OK
$ redis-cli --eval mget.txt foo1 foo2
1) "bar1"
2) "bar2"
Если ваш сценарий LUA слишком долго, - Eval будет иметь большое пользование.
Мониторинг состояния сервера
Мы можем использовать параметр --stat для мониторинга состояния сервера в режиме реального времени и выводить его в режиме реального времени каждую 1 секунду.
$ redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
2 6.66M 100 0 11591628 (+0) 335
2 6.66M 100 0 11653169 (+61541) 335
2 6.66M 100 0 11706550 (+53381) 335
2 6.54M 100 0 11758831 (+52281) 335
2 6.66M 100 0 11803132 (+44301) 335
2 6.66M 100 0 11854183 (+51051) 335
Если вы считаете, что интервал слишком длинный или слишком короткий, вы можете использовать параметр -i для настройки выходного интервала.
Сканировать большой КЛЮЧ
Эта функция настолько полезна, что я пробовал ее бесчисленное количество раз в Интернете. Каждый раз, когда Redis сталкивается со случайной проблемой зависания, первое, что приходит на ум, — есть ли в экземпляре большой KEY.Расширение памяти и освобождение большого KEY вызовут зависание основного потока. Если вы знаете, есть ли в нем большой КЛЮЧ, вы можете написать программу для его сканирования самостоятельно, но это слишком громоздко. redis-cli предоставляет параметр --bigkeys для быстрого сканирования больших ключей в памяти и использует параметр -i для управления интервалом сканирования, чтобы избежать внезапного увеличения сигнала тревоги сервера, вызванного командой сканирования.
$ ./redis-cli --bigkeys -i 0.01
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Biggest zset found so far 'hist:aht:main:async_finish:20180425:17' with 1440 members
[00.00%] Biggest zset found so far 'hist:qps:async:authorize:20170311:27' with 2465 members
[00.00%] Biggest hash found so far 'job:counters:6ya9ypu6ckcl' with 3 fields
[00.01%] Biggest string found so far 'rt:aht:main:device_online:68:{-4}' with 4 bytes
[00.01%] Biggest zset found so far 'machine:load:20180709' with 2879 members
[00.02%] Biggest string found so far '6y6fze8kj7cy:{-7}' with 90 bytes
redis-cli запишет KEY с наибольшей длиной для каждого типа объекта, и для каждого типа объекта обновит самую высокую запись и выведет ее один раз. Он может гарантировать вывод KEY с длиной Top1, но нельзя гарантировать сканирование таких KEY, как Top2 и Top3. Общий метод обработки состоит в том, чтобы сканировать несколько раз или после того, как КЛЮЧ Top1 был удален, сканировать, чтобы подтвердить, есть ли какой-либо следующий по величине КЛЮЧ.
Примеры директив сервера
Теперь в сети есть сервер Redis, у которого OPS слишком высок, и многие бизнес-модули используют этот Redis.Как мы можем определить, какой бизнес вызвал аномально высокий OPS. В это время вы можете сэмплировать инструкции онлайн-сервера, и, наблюдая за сэмплированными инструкциями, вы можете грубо проанализировать бизнес-точки с высокой долей OPS. В это время используется команда монитора, которая мгновенно отобразит все команды, выполненные сервером. Тем не менее, при его использовании обратите внимание даже на использование Ctrl + C для прерывания, иначе ваш дисплей будет трещать слишком много инструкций, которые мгновенно ослепят вас.
$ redis-cli --host 192.168.x.x --port 6379 monitor
1539853410.458483 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"
1539853410.459212 [0 10.100.90.61:56659] "PFADD" "growth:dau:20181018" "2klxkimass8w"
1539853410.462938 [0 10.100.90.62:20681] "GET" "6yax3eb6etq8:{-7}"
1539853410.467231 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2kei0to86ps1"
1539853410.470319 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"
1539853410.473927 [0 10.100.90.61:58128] "GET" "6yax3eb6etq8:{-7}"
1539853410.475712 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2km8sqhlefpc"
1539853410.477053 [0 10.100.90.62:61292] "GET" "6yax3eb6etq8:{-7}"
Диагностика задержки сервера
Обычно мы диагностируем задержку двух машин, используя команду Ping of Unix. Redis также предоставляет команду диагностики задержки, но его принцип отличается. Он диагностирует задержку команды (Ping Command) между текущим компьютером и сервером Redis. Это не только задержка физической сети, но и текущей задержки. Основная нить redis занята или нет. Если вы обнаружите, что задержка команды Ping of Unix очень маленькая, но задержка Redis очень велика, это означает, что сервер Redis слегка застрял при выполнении команды.
$ redis-cli --host 192.168.x.x --port 6379 --latency
min: 0, max: 5, avg: 0.08 (305 samples)
Единицей задержки является мс. redis-cli также может отображать распределение задержки в графическом виде.
$ redis-cli --latency-dist
Автор не описывает значение этого рисунка, читатели могут попытаться его расшифровать.
Удаленное резервное копирование RDB
Выполните следующую команду, чтобы создать резервную копию удаленного экземпляра Redis на локальном компьютере, удаленный сервер выполнит операцию bgsave, а затем передаст файл rdb клиенту. Удаленное резервное копирование rdb дает нам ощущение, что «ученые не выходят на улицу и не разбираются в мировых делах».
$ ./redis-cli --host 192.168.x.x --port 6379 --rdb ./user.rdb
SYNC sent to master, writing 2501265095 bytes to './user.rdb'
Transfer finished with success.
Имитация рабской библиотеки
Если вы хотите наблюдать за синхронизацией данных между главным и подчиненным серверами, вы можете использовать redis-cli для имитации подчиненной библиотеки.
$ ./redis-cli --host 192.168.x.x --port 6379 --slave
SYNC with master, discarding 51778306 bytes of bulk transfer...
SYNC done. Logging commands from master.
...
Первое, что нужно сделать, когда подчиненная библиотека подключена к основной библиотеке, — это полная синхронизация, поэтому нормально видеть, что приведенная выше команда зависла.После завершения первой полной синхронизации будет выводиться инкрементный журнал aof.
Прочтите более подробные технические статьи, отсканируйте приведенный выше QR-код и подпишитесь на общедоступную учетную запись WeChat «Code Cave».