Redis深刻系列-0x010:redis-cli--Redis命令行接口(上)

0x001 redis-cli--Redis命令行接口

redis是一個簡單的命令行接口程序,他容許你在終端直接向Redis發送命令,而且讀取Redis返回的數據。redis

它有兩種模式:shell

- 交互模式(`REPL`):用戶輸入命令,獲取結果。
- 參數模式:命令做爲`redis-cli`的參數傳輸,執行,而且以標準輸出流輸出

在交互模式中,redis-cli的只能提示提供了一個很是好的輸入體驗。數據庫

然而,redis-cli不只僅能作到這樣,它有很是多的選項讓你選擇,能夠經過不一樣的選項讓他進入某種特殊的模式。因此,redis-cli確定是能夠作很是複雜的任務的,好比模擬master複製到slave的數據同步,而且將同步流點出來。檢查Redis服務端的潛在危險而且做出統計,設置能夠以ASCII-art形式顯示潛在危險案例和機率,初次以外還有許多功能。數組

這個指南將會從最簡單的特性開始,而且以將會以高級特性結束,覆蓋了redis-cli各個不一樣的方面。app

若是你想普遍使用Redis,又或者你已經在這麼作了,那麼這篇文章將有很大的可能讓你獲得這種機會。花一些時間熟悉這些特性多是一個很是好的注意,若是你知道redis-cli命令行接口訣竅,你將會看到如何更有效的使用Redis。lua

0x002 命令行使用

將命令當作redis-cli分離的參數來執行命令很是的簡單,同時它能夠在屏幕上以標準輸出命令執行的結果命令行

$ redis-cli incr mycounter
(integer) 7

命令的返回值是7,由於Redis的返回值是類型化的(stringsarraysintegersNULLerrors等),你將會在返回結果中看到類型,他們在兩個括號之間,因此講Redis的返回值做爲另外一個命令的輸入值不是一個好主意,除非咱們想將結果重定向到文件中。調試

一般狀況下,redis-cli若是在ttf模式中,將會顯示一些而外的消息,以加強閱讀性。在其餘模式中,將會自動使用原始輸出,就像接下來的例子code

$ redis-cli incr mycounter > ./output
$ cat ./output 
2

此時,(integer)將會被忽略,由於redis-cli發現並非在終端上輸出,固然,咱們也能夠強制在終端上直接顯示原始信息,使用--raw參數接口

$ redis-cli --raw incr mycounter
3

同理,你能夠強制在輸入文件或者其餘管道中啓用加強模式,使用--no-raw

$ redis-cli --no-raw incr mycounter > ./output
FollowWinter:~ FollowWinter$ cat output 
(integer) 4

0x003 主機,端口,密碼,數據庫

默認狀況下,redis-cli連接的服務端主機地址是127.0.0.1:6379,就像你想的那樣,經過命令行,你能夠簡單的修改這些參數,去指定一個不一樣的主機名字或者IP,使用-h,指定不一樣的端口,使用-p

$ redis-cli -h redis15.localnet.org -p 6390 ping
PONG

若是你的實例是受密碼保護的,-a <password>選項將會實現認證,明企鵝不須要再顯示的調用AUTH命令。

$ redis-cli -a myUnguessablePazzzzzword123 ping
PONG

最後,不使用默認的0號數據庫而使用其餘數據庫也是可能的,可使用 -n <dbnum>選項:

$ redis-cli flushall
OK
$ redis-cli -n 1 incr a
(integer) 1
$ redis-cli -n 1 incr a
(integer) 2
$ redis-cli -n 2 incr a
(integer) 1

這些信息也能夠以URI的形式給出,使用 -u <uri>選項

$ redis-cli -u redis://p%40ssw0rd@redis-16379.hosted.com:16379/0 ping
PONG

0x004 從其餘輸入獲取輸入數據

有兩種方式能夠從其餘程序獲取數據(通常從標準輸入)。一種方式是將從標準輸入讀取的數據裝載到redis-cli的最後一個選項。好比,我想將我電腦上的/etc/services文件內容做爲一個key的值,我可使用-x選項:

$ redis-cli -x set foo < /etc/services
OK
$ redis-cli getrange foo 0 50
"#\n# Network services, Internet style\n#\n# Note that "

就想你再上面的對話中的第一行看到的,SET命令的最後一個選項並無指定。這個參數並無直接把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
OK
(integer) 101
(integer) 6
"101xxx"

全部在這個文件中的命將會一個接着一個的執行,就像是用戶輸入同樣。字符串在必要的時候,可使用引號包裹,因此可使用特殊的符號,好比空格、換行或者其餘特殊字符:

$ cat /tmp/commands.txt
set foo "This is a single argument"
strlen foo
$ cat /tmp/commands.txt | redis-cli
OK
(integer) 25

0x005 連續執行屢次相同命令

在執行時用戶連續屢次執行相同的命令是頗有可能的。在不一樣的上下文中,這是很是有用的,好比當咱們須要連續監控一些key的內容或者輸出內容,或者咱們須要模擬一些重複寫入事件(好比每5s向一個list推入數據)

這個特性受控於兩個選項:-r <count>-i <delay>。第一個標明要執行多少次,第二個配置兩次命令執行的延遲事件,單位是秒(可是也能夠指定像0.1這樣的小數,用來表示100毫秒)。

默認延遲是0,因此命令會盡量快的執行

$ redis-cli -r 5 incr foo
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

若是要永遠執行某個命令,count選項值爲-1,若是爲了一直監控RSS的內存大小,或許能夠這樣使用命令:

$ redis-cli -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 ...

0x006 使用redis-cli插入混合的數據

使用redis-cli插入混合的數據是一個重要的課題,將會在獨立的文章說明,請閱讀混合數據插入指南

0x007 導出CSV文件

有時候,你須要使用redis-cli快速的導出Redis中的數據給其餘程序使用,可使用CSV輸出特性:

$ redis-cli lpush mylist a b c d
(integer) 4
$ redis-cli --csv lrange mylist 0 -1
"d","c","b","a"

此時不可能把整個數據項這樣導出,可是隻有一個簡單的命令就能夠作到導出數據到csv文件。

0x008 執行lua腳本

Redis 3.2開始,咱們就普遍的支持使用新的Lua調試器來調試和編寫Lua腳本,關於這個特性,能夠查閱Redis Lua 調試文檔

然而,就算沒有使用調試器,你也可使用redis-cli從一個文件執行腳本,比在shell交互中輸入腳本或者做爲參數舒服多了

$ cat /tmp/script.lua
return redis.call('set',KEYS[1],ARGV[1])
$ redis-cli --eval /tmp/script.lua foo , bar
OK

RedisEVAL命令攜帶了腳本須要用到的key,另外一個卻沒有key參數,當調用EVAL的時候,你以數字的方式提供了一個key的數字。然而在前面redis-cli使用--eval選項的時候,不須要特地指定key的序號。它性慣性的使用逗號分隔的key序列做爲替代。這就是爲何你再前面看到foo, bar做爲參數。

因此 foo將會由KSYS數組組成,barARGV數組組成
So foo will populate the KEYS array, and bar the ARGV array.

--eval選項在編寫簡單腳本的時候特別有用。其餘複雜的工做,使用Lua調試器將會更加溫馨,這兩種方式能夠混合使用,由於調試器也是執行外部腳本文件。

相關文章
相關標籤/搜索