info.txt$wc-linfo.txt120i"/> info.txt$wc-linfo.txt120i">

 >  기사  >  데이터 베이스  >  Redis 명령줄 도구를 사용하는 방법

Redis 명령줄 도구를 사용하는 방법

PHPz
PHPz앞으로
2023-06-03 08:53:051180검색

단일 명령 실행

Redis 서버에 접속할 때 우리는 보통 redis-cli를 이용해 대화형 모드로 들어간 뒤, 질문하고 대답하면서 서버에 읽고 쓰는 방식을 사용합니다. . 명령을 실행하고 명령 매개변수를 redis-cli에 직접 전달하여 출력 결과를 얻는 또 다른 "직접 모드"가 있습니다.

<code class="hljs bash">$ redis-cli incrby foo 5<br>(integer) 5<br>$ redis-cli incrby foo 5<br>(integer) 10<br></code>


출력 내용이 큰 경우 출력을 외부 파일로 리디렉션할 수도 있습니다.

<code class="hljs php">$ redis-cli info > info.txt<br>$ wc -l info.txt<br>     120 info.txt<br></code>


위 명령이 가리키는 서버는 기본 서버 주소입니다. 할 수 있어요

<code class="hljs php">// -n 2 表示使用第2个库,相当于 select 2<br>$ redis-cli -h localhost -p 6379 -n 2 ping<br>PONG<br></code>

명령을 일괄적으로 실행

일상적인 온라인 개발 과정에서 때로는 수동으로 데이터를 생성하여 Redis로 가져와야 하는 경우가 있습니다. 일반적으로 우리는 이를 수행하기 위한 스크립트를 작성합니다. 하지만 더 편리한 또 다른 방법이 있습니다. redis-cli를 직접 사용하여 일련의 명령을 일괄적으로 실행하는 것입니다.

<code class="hljs bash">$ cat cmds.txt<br>set foo1 bar1<br>set foo2 bar2<br>set foo3 bar3<br>......<br>$ cat cmds.txt | redis-cli<br>OK<br>OK<br>OK<br>...<br></code>


위 명령은 Unix 파이프를 사용하여 cat 명령의 표준 출력을 redis-cli의 표준 입력에 연결합니다. 실제로 입력 리디렉션을 직접 사용하여 명령을 일괄적으로 실행할 수도 있습니다.

<code class="hljs php">$ redis-cli < cmds.txt<br/>OK<br/>OK<br/>OK<br/>...<br/></code>

set multi-line string

문자열에 여러 줄이 있고 이를 set 명령에 전달하려는 경우 redis-cli는 어떻게 합니까? 표준 입력의 내용을 마지막 인수로 사용하는 -x 옵션을 사용할 수 있습니다.

<code class="hljs vbscript">$ cat str.txt<br/>Ernest Hemingway once wrote,<br/>"The world is a fine place and worth fighting for."<br/>I agree with the second part.<br/>$ redis-cli -x set foo < str.txt<br/>OK<br/>$ redis-cli get foo<br/>"Ernest Hemingway once wrote,\n\"The world is a fine place and worth fighting for.\"\nI agree with the second part.\n"<br/></code>

명령의 반복 실행

redis-cli는 명령의 여러 번 반복 실행도 지원합니다. 각 명령의 실행 간격을 설정하여 시간에 따라 변화하는 특정 명령의 출력 내용을 관찰할 수 있습니다.

<code class="hljs makefile">// 间隔1s,执行5次,观察qps的变化<br/>$ redis-cli -r 5 -i 1 info | grep ops<br/>instantaneous_ops_per_sec:43469<br/>instantaneous_ops_per_sec:47460<br/>instantaneous_ops_per_sec:47699<br/>instantaneous_ops_per_sec:46434<br/>instantaneous_ops_per_sec:47216<br/></code>


횟수를 -1로 설정하면 수없이 반복되어 영원히 실행됩니다. -i 매개변수가 제공되지 않으면 간격이 없으며 실행이 계속 반복됩니다. 대화형 모드에서 명령어를 반복적으로 실행할 수도 있습니다. 명령어 앞에 횟수를 추가하세요.

<code class="hljs css">127.0.0.1:6379> 5 ping<br>PONG<br>PONG<br>PONG<br>PONG<br>PONG<br># 下面的指令很可怕,你的屏幕要愤怒了<br>127.0.0.1:6379> 10000 info<br>.......<br></code>

Export csv

Redis 데이터베이스 전체를 CSV 형식으로만 내보낼 수는 없지만, 단일 명령을 CSV 형식으로 내보낼 수 있습니다.

<code class="hljs php">$ redis-cli rpush lfoo a b c d e f g<br>(integer) 7<br>$ redis-cli --csv lrange lfoo 0 -1<br>"a","b","c","d","e","f","g"<br>$ redis-cli hmset hfoo a 1 b 2 c 3 d 4<br>OK<br>$ redis-cli --csv hgetall hfoo<br>"a","1","b","2","c","3","d","4"<br></code>


물론 이 내보내기 기능은 상대적으로 약합니다. 단지 쉼표로 구분된 문자열 묶음일 뿐입니다. 그러나 명령의 일괄 실행을 결합하여 여러 명령어의 내보내기 효과를 확인할 수 있습니다.

<code class="hljs php">$ redis-cli --csv -r 5 hgetall hfoo<br>"a","1","b","2","c","3","d","4"<br>"a","1","b","2","c","3","d","4"<br>"a","1","b","2","c","3","d","4"<br>"a","1","b","2","c","3","d","4"<br>"a","1","b","2","c","3","d","4"<br></code>


이를 보면 독자는 --csv 매개변수의 효과가 출력을 한 번 변환하고 이를 쉼표로 구분하는 것일 뿐이라는 것을 이해해야 합니다.

Lua 스크립트 실행

lua 스크립트 섹션에서는 eval 명령을 사용하여 스크립트 문자열을 실행할 때마다 스크립트 내용을 한 줄 문자열로 압축한 다음 eval 명령을 호출합니다. 그리고 가독성이 좋지 않습니다. redis-cli는 이를 고려하여 스크립트 파일을 직접 실행할 수 있습니다.

<code class="hljs ruby">127.0.0.1:6379> eval "return redis.pcall('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])" 2 foo1 foo2 bar1 bar2<br>OK<br>127.0.0.1:6379> eval "return redis.pcall('mget', KEYS[1], KEYS[2])" 2 foo1 foo2<br>1) "bar1"<br>2) "bar2"<br></code>


아래에서는 위의 명령을 스크립트 형태로 실행합니다. 매개변수 형식이 다릅니다. KEY와 ARGV는 쉼표로 구분해야 하며 KEY 매개변수 수를 제공할 필요가 없습니다. lua 스크립트가 너무 길면 --eval이 유용할 것입니다.

서버 상태 모니터링

--stat 매개변수를 사용하면 서버 상태를 실시간으로 모니터링하고, 1초마다 실시간으로 출력할 수 있습니다.

<code class="hljs php">$ cat mset.txt<br>return redis.pcall('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])<br>$ cat mget.txt<br>return redis.pcall('mget', KEYS[1], KEYS[2])<br>$ redis-cli --eval mset.txt foo1 foo2 , bar1 bar2<br>OK<br>$ redis-cli --eval mget.txt foo1 foo2<br>1) "bar1"<br>2) "bar2"<br></code>

간격이 너무 길거나 짧다고 생각되면 -i 매개변수를 사용하여 출력 간격을 조정할 수 있습니다.

큰 KEY를 스캔하세요

이 기능은 너무 실용적이어서 온라인에서 수없이 시도해 보았습니다. Redis가 가끔 지연 문제를 겪을 때마다 가장 먼저 떠오르는 것은 인스턴스에 큰 KEY가 있는지 여부입니다. 큰 KEY의 메모리 확장 및 해제로 인해 메인 스레드가 지연됩니다. 안에 큰 KEY가 있는지 안다면 직접 스캔하는 프로그램을 작성할 수도 있겠지만, 너무 번거롭습니다. redis-cli는 --bigkeys 매개변수를 제공하여 메모리의 큰 KEY를 빠르게 스캔합니다. -i 매개변수를 사용하여 스캔 명령으로 인해 서버 작업이 갑자기 증가하는 것을 방지하기 위해 스캔 간격을 제어합니다.

<code class="hljs perl">$ redis-cli --stat<br>------- data ------ --------------------- load -------------------- - child -<br>keys       mem      clients blocked requests            connections<br>2          6.66M    100     0       11591628 (+0)       335<br>2          6.66M    100     0       11653169 (+61541)   335<br>2          6.66M    100     0       11706550 (+53381)   335<br>2          6.54M    100     0       11758831 (+52281)   335<br>2          6.66M    100     0       11803132 (+44301)   335<br>2          6.66M    100     0       11854183 (+51051)   335<br></code>

redis-cli는 각 개체 유형에 대해 가장 긴 길이의 KEY를 기록합니다. 각 개체 유형에 대해 새로 고치면 가장 높은 레코드가 즉시 출력됩니다. Top1 길이의 KEY 출력은 보장할 수 있지만 Top2, Top3 등의 KEY를 스캔할 수 있다는 보장은 없습니다. 일반적인 접근 방식은 여러 검색을 수행하거나 우선 순위가 가장 높은 키워드를 제거한 다음 다시 검색하여 우선 순위가 더 낮은 키워드가 있는지 확인하는 것입니다.

샘플링 서버 지침

이제 OPS가 너무 높은 Redis 서버가 온라인에 있습니다. 많은 비즈니스 모듈이 이 Redis를 사용하고 있으며 비정상적으로 높은 OPS를 유발하는 비즈니스를 어떻게 확인할 수 있습니까? 이때, 온라인 서버의 명령어를 샘플링하여 관찰하면 OPS 비중이 높은 업무 포인트를 대략적으로 분석할 수 있습니다. 모니터 명령을 사용하면 서버에서 실행되는 모든 명령을 한 번에 표시할 수 있습니다. 사용할 때 강제로 중단하고 싶은 경우에도 Ctrl+C를 눌러야 합니다. 그렇지 않으면 디스플레이에 너무 많은 지침이 나타나서 순식간에 눈부시게 튀게 됩니다.

<code class="hljs php">$ redis-cli --host 192.168.x.x --port 6379 monitor<br>1539853410.458483 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"<br>1539853410.459212 [0 10.100.90.61:56659] "PFADD" "growth:dau:20181018" "2klxkimass8w"<br>1539853410.462938 [0 10.100.90.62:20681] "GET" "6yax3eb6etq8:{-7}"<br>1539853410.467231 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2kei0to86ps1"<br>1539853410.470319 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"<br>1539853410.473927 [0 10.100.90.61:58128] "GET" "6yax3eb6etq8:{-7}"<br>1539853410.475712 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2km8sqhlefpc"<br>1539853410.477053 [0 10.100.90.62:61292] "GET" "6yax3eb6etq8:{-7}"<br></code>

诊断服务器时延

通常我们使用Unix的ping命令来测量两台计算机的延迟。Redis 也提供了时延诊断指令,不过它的原理不太一样,它是诊断当前机器和 Redis 服务器之间的指令(PING指令)时延,它不仅仅是物理网络的时延,还和当前的 Redis 主线程是否忙碌有关。如果你发现 Unix 的 ping 指令时延很小,而 Redis 的时延很大,那说明 Redis 服务器在执行指令时有微弱卡顿。

<code class="hljs lua">$ redis-cli --host 192.168.x.x --port 6379 --latency<br>min: 0, max: 5, avg: 0.08 (305 samples)<br></code>


时延单位是 ms。redis-cli 还能显示时延的分布情况,而且是图形化输出。

<code class="hljs php">$ redis-cli --latency-dist<br></code>


这个图形的含义作者没有描述,读者们可以尝试破解一下。

远程 rdb 备份

执行下面的命令就可以将远程的 Redis 实例备份到本地机器,远程服务器会执行一次bgsave操作,然后将 rdb 文件传输到客户端。远程 rdb 备份让我们有一种“秀才不出门,全知天下事”的感觉。

<code class="hljs delphi">$ ./redis-cli --host 192.168.x.x --port 6379 --rdb ./user.rdb<br>SYNC sent to master, writing 2501265095 bytes to './user.rdb'<br>Transfer finished with success.<br></code>

模拟从库

如果你想观察主从服务器之间都同步了那些数据,可以使用 redis-cli 模拟从库。

<code class="hljs javascript">$ ./redis-cli --host 192.168.x.x --port 6379 --slave<br>SYNC with master, discarding 51778306 bytes of bulk transfer...<br>SYNC done. Logging commands from master.<br>...<br></code>


从库连上主库的第一件事是全量同步,所以看到上面的指令卡顿这很正常,待首次全量同步完成后,就会输出增量的 aof 日志。

위 내용은 Redis 명령줄 도구를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제