redis入門指南(七)—— 安全、協議、管理工具及命令屬性
寫在前面
學習《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在啟動時(將資料從硬碟載入到記憶體)只會執行擁有此屬性的命令。