Go 語言實現的 redis-cli

593021743 9年前發布 | 27K 次閱讀 Redis NoSQL數據庫

為何造新輪子?

有時候,我想查下線上的 redis 數據,但是我不能直接在內網訪問生產環境的機器,我只能通過跳板機登錄上我擁有權限的機器,而我擁有權限(開發權限)的機器上并沒有安裝 redis-cli。這時候我只能請求運維同學幫我裝一個,雖然對他們來說只是敲一條命令的事情, 但是每次都麻煩別人,不是很好,而且當你找別人的時候,別人不一定有空。為什么裝完了,下次還得裝呢?這涉及到我們的運維體系設計問題。開發可以申請自己負責的項目的機器權限,可以是永久權限,也可以是臨時的權限,過期失效。因為微服務的原因,我手上的有權限的機器不少,但是我不記得哪臺機器上有 redis-cli, 也許當初安裝 redis-cli 的那臺機器我只有臨時權限,而且過期了,誰記得這么多呢! 我只期望一點: 當我需要一個 redis-cli, 我能在很短時間內,自助快速安裝一個。

裝過 redis 的同學應該都知道,redis 是通過動態鏈接的方式引用了外部庫的,也就是你一般是不可能直接拷貝一個編譯好的 linux 二進制文件到另一臺 linux 機器上直接執行的

$ ldd redis-cli
    linux-vdso.so.1 =>  (0x00007fffe93fe000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f17ff5f9000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f17ff3db000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f17ff015000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f17ff919000)

上面提到需求, 我想自己安裝一個 redis-cli,不需要運維的介入。 讀者也許會問,為什么不直接去 github clone 一份,然后自己編譯一個 redis-cli?

我也想這樣啊,可是網速實在感人:

git clone https://github.com/antirez/redis.git
Initialized empty Git repository in /home/work/app/redis/.git/
remote: Counting objects: 45784, done.
remote: Compressing objects: 100% (92/92), done.
Receiving objects:   0% (62/45784), 20.01 KiB | 5 KiB/s

Receiving objects: 0% (291/45784), 84.01 KiB | 1 KiB/s

Receiving objects: 2% (1242/45784), 300.01 KiB | 7 KiB/s </pre>

所以,我只能自救了。

功能介紹

這個 redis-cli 是基于 ledis-cli 的,這是我的前同事 @siddongtang 的 ledisdb 的附屬工具,我當時也貢獻了幾行代碼。但是 ledis-cli 當時是為了適配 ledisdb 而作,只有很基礎的 REPL 功能,連直接執行命令都不支持,當然也沒有我非常喜歡的 raw output format 功能 和 monitor 功能。于是我自己改了下,使之表現盡量和官方的 redis-cli 一致。

目前的功能如下:

  • 基本的 hostname, port, auth, db 選項支持,當然也支持 socket 的方式連接
  • 支持 RESP (REdis Serialization Protocol) 協議,畢竟 ledisdb 是支持 RESP,所以這部分應該沒啥問題。
  • REPL,即交互式執行命令
  • 直接執行命令,非交互式
  • monitor 命令支持,這個的原理就是你向 redis-server 發一個 monitor 命令,然后你可以不斷地從 redis-server 讀取命令輸出
  • raw 輸出,對于 JSON 格式的數據比較友好。
  • 最大亮點應該就是編譯一次,隨處運行(因為go編譯程序的時候把 runtime 也編譯進去了)

功能演示

$ ./redis-cli --help
Usage of ./redis-cli:
  -a string
        Password to use when connecting to the server
  -h string
        Server hostname (default "127.0.0.1")
  -n int
        Database number(default 0)
  -p int
        Server server port (default 6379)
  -raw
        Use raw formatting for replies
  -s string
        Server socket. (overwrites hostname and port)

Almost the same as the official redis-cli.

$ ./redis-cli 127.0.0.1:6379> get info "{\"age\":1,\"name\":\"cdh\"}"

$ ./redis-cli --raw 127.0.0.1:6379> get info {"age":1,"name":"cdh"}

$ ./redis-cli get info "{\"age\":1,\"name\":\"cdh\"}"

$ ./redis-cli --raw get info {"age":1,"name":"cdh"}

$ ./redis-cli monitor OK 1483327130.764598 [0 127.0.0.1:61344] "PING" 1483327133.769646 [0 127.0.0.1:61344] "PING" 1483327136.768431 [0 127.0.0.1:61344] "PING" 1483327139.767084 [0 127.0.0.1:61344] "PING" ... </pre>

安裝

可通過 go-get 的方式安裝:

go get -u -v github.com/holys/redis-cli

如果非 Go 用戶又想體驗下,可以在 release 頁面下載事先編譯好的可執行文件來玩玩。目前提供了

64位機器的 darwin, linux 和 windows 環境可執行文件。

 

 

 本文由用戶 593021743 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!