redis入門指南(七)—— 安全、協議、管理工具及命令屬性

Dylan~ 發表於 2020-09-22

寫在前面

  學習《redis入門指南》筆記,結合實踐,只記錄重要,明確,屬於新知的相關內容。

 

安全

  1、可以使用bind引數繫結一個地址,使redis只接受這個地址的連線。

  2、使用requirepass引數,設定一個redis密碼,使得每次客戶端連線時都要傳送密碼,當執行復制時,如果主庫設定了密碼,需要在從庫的配置檔案通過masterauth引數設定主庫的密碼。

  3、對命令重新命名,只需要在配置檔案中配置引數rename-command,格式為:

1 rename-command 原命令名稱 新命令名稱

  若要禁用某個命令,可以重新命名成空字串 “” 。

 

通訊協議

  4、redis支援兩種協議,一種是比較直觀的在telnet中輸入的簡單協議,另一種是二進位制安全的統一請求協議,這兩種協議只是命令的格式有區別,命令返回值的格式是一樣的。

  5、簡單協議適合在telnet中與redis通訊,格式只是簡單的將命令和各個引數以空格分開。

  6、返回值格式有5種:

    a、錯誤回覆

      以 - 開頭,加錯誤資訊,以 \r\n 結尾

      -ERR unknown command 'haha'\r\n

    b、狀態回覆

  加狀態資訊,以\r\n結尾

  +OK\r\n

c、整數回覆

  以+開頭,加數字,以\r\n結尾

  +3\r\n

d、字串回覆

  以$開頭,加字串長度並以\r\n分隔,加字串內容,以\r\n結尾

  $3\r\nPONG\r\n

  如果返回值為nil,則以$-1和空字串區別

e、多行字串回覆

  以*開頭,加字串組數並以\r\n分隔,加字串回覆的具體內容

  *3\r\n$1\r\n3\r\n$1\r\n2\r\n$3\r\n1\r\n

7、統一請求協議的格式和多行字串回覆的格式類似,如:

  SET foo bar

  *3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n1\r\n$3\r\nbar\r\n

  redis主從複製和AOF都使用了統一請求協議
 

管理工具

  8、使用redis-cli檢視耗時日誌

    SLOWLOG GET

    通過配置檔案引數slow-log-slower-than設定耗時命令的限制,單位為微秒,設定為負數則代表關閉慢日誌;slow-max-len限制記錄條數,耗時命令日誌記錄在記憶體中。每條耗時命令日誌包含4個組成部分:日誌唯一id、執行的UNIX時間、執行耗時(微秒)、命令及其引數。

  9、命令監控MONTITOR,執行這個命令後,redis會將所有執行的命令都會在redis-cli列印出來,這個命令會降低一半的負載能力,僅用於除錯。(Instagram團隊使用python開發的基於monitor命令的工具redis-faina,可以分析出最常用的命令,訪問最頻繁的鍵等資訊)

  10、工具Rdbtools是一個redis的快照檔案解析器,可以將快照資料匯出JSON資料檔案,分析redis種每個鍵的佔用情況。也可以將每個鍵的儲存情況匯出CSV檔案便於分析。示例如下:

1 rdb --command json /path/redisdump.rdb > rdboutput.json
2 rdb -c memory /path/redisdump.rdb > rdboutput.cvs

 

redis命令屬性

11、REDIS_CMD_WRITE

  表示會修改資料庫資料,只讀從庫不可執行這類命令,另外lua指令碼中在執行了擁有REDIS_CMD_RANDOM屬性的命令後,不可執行擁有此屬性的命令。

12、REDIS_CMD_DENYOOM

  表示可能增加redis佔用的儲存空間,擁有此屬性的命令必然擁REDIS_CMD_WRITE屬性,反之不然。當佔用空間達到配置檔案maxmemory引數指定的值且根據maxmemory-policy引數無法釋放空間時,會拒絕執行此類命令。

13、REDIS_CMD_NOSCRIPT

  擁有此屬性的命令無法在指令碼中執行

14、REDIS_CMD_RANDOM

  指令碼中在執行了擁有此屬性的命令後,不可執行擁有REDIS_CMD_WRITE屬性的命令。

15、REDIS_CMD_SORT_FOR_SCRIPT

  擁有此屬性的命令會產生隨機結果,在指令碼中使用時,redis會對結果進行排序。

16、REDIS_CMD_LOADING

  redis在啟動時(將資料從硬碟載入到記憶體)只會執行擁有此屬性的命令。