一、介紹
redis學了有一段時間了,以前都是看視頻,看教程,很少看官方的東西。現在redis的東西要看的都差不多看完了。網上的東西也不多了。剩下來就看看官網的東西吧,一遍翻譯,一遍測試。不錯的使用體驗,今天開始就寫一下redis的客戶端的使用,也就是redis-cli工具類,這個文件的內容真不少,一次寫完有點吃力。分多次寫吧。
二、使用詳解
1、redis-cli,Redis命令行界面
redis-cli是Redis命令行界面,它是一個允許向Redis發送命令、並直接從終端讀取服務器發送的回復的簡單的程序。
它有兩種主要模式:一種交互模式,其中有一個REPL(讀取評估打印循環),用戶輸入命令並獲取回復;另一種模式是將命令作為redis-cli的參數發送,執行並打印在標准輸出中。
在交互模式下,redis-cli具有基本的行編輯功能,可以提供良好的打字體驗。
然而,redis-cli不僅僅具有以上功能,還有更高級的用法。有些選項可用來啟動程序並將其置於特殊模式之下,以便redis-cli可以完成更復雜的任務,如模擬從站並打印從主站接收到的復制流,檢查Redis服務器的延遲,並顯示統計數據,甚至是延時采樣和頻率的ASCII-art頻譜圖,以及其他許多事情。
本指南將涵蓋redis-cli的不同方面,從最簡單到最高級的結尾。
如果您要廣泛使用Redis,或者您已經這么做了,那么很可能會碰巧使用redis-cli。 花一些時間熟悉它可能是一個非常好的主意,一旦你知道了命令行界面的所有技巧,你就會更有效地使用Redis。
2、命令行的用法
只需運行一個命令並在標准輸出上打印其答復就如同輸入要作為redis-cli的分隔參數執行的命令一樣簡單:
$ redis-cli -h 192.168.127.130 -p 6379 incr mycounter (integer) 7
該命令的結果是“7”。 由於Redis的結果是強類型的(它們可以是字符串,數組,整數,NULL,錯誤等等),您可以看到括號之間的就是結果的類型。 但是,當redis-cli的輸出必須用作另一個命令的輸入,或者我們希望將它重定向到一個文件時,這並不是一個好的做法。
實際上,redis-cli當檢測到標准輸出是一個tty設備時就會來顯示這些附加信息以幫助提高人們的可讀性。 否則,它將通過 auto-enable 啟用原始輸出模式,如下例所示:
$ redis-cli -h 192.168.127.130 -p 6379 incr mycounter > /tmp/output.txt $ cat /tmp/output.txt 8
由於CLI檢測到輸出不再寫入終端,因此這次輸出中才省略了(整數)這個顯示。 你甚至可以在終端上用--raw選項強制原始輸出:
$ redis-cli -h 192.168.127.130 -p 6379 --raw incr mycounter 9
同樣,通過使用--no-raw,可以在寫入文件或將管道傳送到其他命令時強制讀取可讀的輸出。
3、主機,端口,密碼和數據庫
默認情況下,redis-cli在127.0.0.1端口6379連接到服務器。正如您所猜測的,您可以使用命令行選項輕松更改此設置。 要指定不同的主機名或IP地址,請使用-h。 為了設置不同的端口,請使用-p。
$ redis-cli -h 192.168.127.130 -p 6379 ping PONG
如果您的實例受密碼保護,-a <密碼>選項將執行身份驗證,以保證明確使用AUTH命令的需要:
$ redis-cli -h 192.168.127.130 -p 6379 -a myUnguessablePazzzzzword123 ping PONG
最后,可以通過使用-n <dbnum>選項發送一個命令,該命令對除默認數字零以外的數據庫號進行操作:
$ redis-cli -h 192.168.127.130 -p 6379 flushall OK $ redis-cli -h 192.168.127.130 -p 6379 -n 1 incr a (integer) 1 $ redis-cli -h 192.168.127.130 -p 6379 -n 1 incr a (integer) 2 $ redis-cli -h 192.168.127.130 -p 6379 -n 2 incr a (integer) 1
部分或全部信息也可以通過使用-u <uri>選項和一個有效的URI來提供:
$ redis-cli -u redis://p%40ssw0rd@redis-16379.hosted.com:16379/0 ping PONG
4、從其他程序獲取輸入
有兩種方法可以使用redis-cli來獲取來自其他命令的輸入(基本上來自標准輸入)。 一種是使用我們從標准輸入讀取的有效數據作為最后一個參數。 例如,假設在我的電腦里,為了將Redis的key設置到文件/etc/services的內容里,我可以使用-x選項:
$ redis-cli -h 192.168.127.130 -p 6379 -x set foo < /etc/services OK $ redis-cli -h 192.168.127.130 -p 6379 getrange foo 0 50 "#\n# Network services, Internet style\n#\n# Note that "
正如您在上述會話的第一行中看到的那樣,SET命令的最后一個參數未被指定。 參數只是SET foo,並沒有為我希望的key設置的實際的值。
相反,指定了-x選項,並將文件重定向到CLI的標准輸入。所以輸入被讀取,並被用作命令的最后一個參數。這對編寫腳本很有用。
另一種不同的方法是為redis-cli提供一個寫在文本文件中的命令序列:
$ cat /tmp/commands.txt set foo 100 incr foo append foo xxx get foo $ cat /tmp/commands.txt | redis-cli -h 192.168.127.130 -p 6379 OK (integer) 101 (integer) 6 "101xxx"
command.txt中的所有命令都由redis-cli一個接一個地執行,就好像它們是由用戶交互式鍵入的一樣。 如果需要,可以在文件內使用雙引號來標識字符串,這樣在字符串中間就可以包含空格或換行符或其他特殊字符,但是此字符串是作為一個參數使用的:
$ cat /tmp/commands.txt set foo "This is a single argument" strlen foo $ cat /tmp/commands.txt | redis-cli -h 192.168.127.130 -p 6379 OK (integer) 25
5、連續運行相同的命令
在執行過程中,當用戶選擇暫停的情況下執行相同命令的指定次數是可行的。這在不同情況下很有用,例如,當我們想要持續監視一些 key 的內容或INFO字段輸出時,或者當我們想模擬一些重復寫入事件時(比如每5秒將一個新項目推入列表)。
該功能由兩個選項控制:-r <count>和-i <delay>。 第一種選項表示運行命令的次數,第二種表示不同命令調用之間的延遲,以秒為單位(能夠指定十進制數字,如0.1表示100毫秒)。
默認情況下,間隔(或延遲)被設置為0,所以命令只是盡快執行:
$ redis-cli -h 192.168.127.130 -p 6379 -r 5 incr foo (integer) 1 (integer) 2 (integer) 3 (integer) 4 (integer) 5
要長時間運行相同的命令,請使用-1作為計數。 因此,為了隨時監控RSS存儲器的大小,可以使用如下的命令:
$ redis-cli -h 192.168.127.130 -p 6379 -r -1 -i 1 INFO | grep rss_human used_memory_rss_human:1.38M used_memory_rss_human:1.38M used_memory_rss_human:1.38M ... a new line will be printed each second ...
6、使用redis-cli大量插入數據
使用redis-cli進行大數據量插入會使用單獨的章節來說,因為它本身就是一個有價值的話題。請參閱我們的《批量插入指南》。
7、CSV輸出
有時候您可能想要使用redis-cli來快速將數據從Redis導出到外部程序。 這可以使用CSV(逗號分隔值)輸出功能來完成:
$ redis-cli -h 192.168.127.130 -p 6379 lpush mylist a b c d (integer) 4 $ redis-cli -h 192.168.127.130 -p 6379 --csv lrange mylist 0 -1 "d","c","b","a"
目前無法像這樣導出整個數據庫,但只能用CSV輸出運行單個命令。
8、運行Lua腳本
redis-cli對使用Lua腳本編寫的新Lua調試工具提供了廣泛的支持,穩定版本是從Redis 3.2開始。有關此功能,請參閱《Redis Lua調試器文檔》https://redis.io/topics/ldb。
但是,即使不使用調試器,與以交互方式將腳本輸入到shell或作為參數相比,您可以使用redis-cli從文件運行腳本,這種方式更加舒適:
$ cat /tmp/script.lua return redis.call('set',KEYS[1],ARGV[1]) $ redis-cli -h 192.168.127.130 -p 6379 --eval /tmp/script.lua foo , bar OK
Redis EVAL命令將腳本使用的鍵列表和其他非鍵參數作為不同的數組。在調用EVAL命令時,您可以將key的數量作為一個數字提供。 但是,使用redis-cli並使用上面的--eval選項,並沒有明確指定key的數量。相反,它使用用逗號分隔鍵和參數。這就是為什么在上面的調用中你看到foo,bar作為參數。
所以foo會填充KEYS數組,bar會填充ARGV數組。
編寫簡單腳本時,--eval選項很有用。對於更復雜的工作,使用Lua調試器肯定更適合。可以混合使用這兩種方法,因為調試器也使用來自外部文件的執行腳本。
9、交互模式
到目前為止,我們探討了如何使用Redis CLI作為命令行程序。 這對於腳本和某些類型的測試非常有用,但是大多數人的大部分時間將會使用redis-cli的交互模式。
在交互模式下,用戶在提示符下鍵入Redis命令。該命令被發送到服務器,進行處理,回復被解析回來並呈現為更簡單的形式來閱讀。
在交互模式下運行CLI不需要什么特別的東西 - 在沒有任何參數的情況下運行即可,並且您處於:
$ redis-cli -h 192.168.127.139 -p 6379 192.168.127.130:6379> ping PONG
字符串192.168.127.130:6379>是提示符。它提醒您,您已連接到給定的Redis實例。
當連接的服務器發生更改時,或者當您在與數據庫編號0不同的數據庫上運行時,提示會發生的更改:
192.168.127.130:6379> select 2 OK 192.168.127.130:6379[2]> dbsize (integer) 1 192.168.127.130:6379[2]> select 0 OK 192.168.127.130:6379> dbsize (integer) 503
9.1、處理連接和重新連接
在交互模式下使用connect命令可以通過指定我們要連接的主機名和端口來連接到不同的實例:
192.168.127.130:6379> connect metal 6379 metal:6379> ping PONG
正如你所看到的以下的提示也會有相應的改變。如果用戶嘗試連接到無法訪問的實例,則redis-cli將進入斷開連接模式,並且准備使用新命令嘗試重新連接:
192.168.127.130:6379> connect 192.168.127.130 9999 Could not connect to Redis at 192.168.127.130:9999: Connection refused not connected> ping Could not connect to Redis at 192.168.127.130:9999: Connection refused not connected> ping Could not connect to Redis at 192.168.127.130:9999: Connection refused
通常在檢測到斷開連接后,CLI始終嘗試以透明方式重新連接:如果嘗試失敗,則會顯示錯誤並進入斷開連接狀態。 以下是斷開和重新連接的示例:
192.168.127.130:6379> debug restart Could not connect to Redis at 192.168.127.130:6379: Connection refused not connected> ping PONG 192.168.127.130:6379> (now we are connected again)
當執行重新連接時,redis-cli會自動重新選擇所選的上一個數據庫編號。然而,關於連接的所有其他狀態都會丟失,例如,事務的狀態信息就會丟失,當我們處於事務的執行過程中的時候:
$ redis-cli -h 192.168.127.130 -p 6379 192.168.127.130:6379> multi OK 192.168.127.130:6379> ping QUEUED ( here the server is manually restarted ) 192.168.127.130:6379> exec (error) ERR EXEC without MULTI
在交互模式下使用CLI進行測試時,這通常不是問題,但您應該了解這一限制。
9.2、編輯,歷史和完成
由於redis-cli使用《linenoise行編輯庫》,因此它一直具有行編輯功能,而不依賴於libreadline或其他可選庫。
您可以訪問已執行的命令的歷史記錄,以便通過按方向鍵(上和下)來避免重復鍵入它們。在用戶主目錄內的一個名為.rediscli_history的文件中,指定HOME環境變量,在重新啟動CLI的時候保留歷史記錄。 可以通過設置 REDISCLI_HISTFILE 環境變量來使用不同的歷史文件名,並通過將其設置為 /dev/null 來禁用它。
CLI客戶端還能夠通過按TAB鍵執行命令名稱的補全操作,<TAB>表示按TAB鍵,如下例所示:
192.168.127.130:6379> Z<TAB> 192.168.127.130:6379> ZADD<TAB> 192.168.127.130:6379> ZCARD<TAB>
9.3、運行相同的命令N次
可以通過在命令名前添加一個數字來多次運行相同的命令:
192.168.127.130:6379> 5 incr mycounter (integer) 1 (integer) 2 (integer) 3 (integer) 4 (integer) 5
9.4、顯示有關Redis命令的幫助
Redis有很多命令,有時候,當你測試的時候,你可能不記得參數的確切順序。redis-cli使用help命令為大多數Redis命令提供聯機幫助。 該命令可以以兩種形式使用:
1、help @ <category>顯示關於給定類別的所有命令。 類別包括:@generic,@list,@set,@sorted_set,@hash,@pubsub,@transactions,@connection,@server,@scripting,@hyperloglog。
2、help <commandname>顯示作為參數給出的命令的特定幫助。
例如,為了顯示PFADD命令的幫助,使用:
192.168.127.130:6379> help PFADD PFADD key element [element ...] summary: Adds the specified elements to the specified HyperLogLog. since: 2.8.9 group: hyperloglog
PFADD key element [element ...]
摘要:將指定的元素添加到指定的HyperLogLog。
從版本:2.8.9
請注意,幫助也支持TAB補全功能。
9.5、清除終端屏幕
在交互模式下使用 clear 命令將清除終端屏幕。
后面還有很多高級內容,就放在下篇文章里面了。
三、總結
好了,今天就寫到這里了,剩下還有很多高級的內容需要些,慢慢來,一口不能吃一個胖子,而且翻譯起來也挺耗時間的。剩下的內容就留到下一篇文章吧。繼續努力,不能松懈。如果想看原文,地址如下:https://redis.io/topics/rediscli。
