一、安全性
1、運行環境
Redis以簡潔為美,其安全性沒有太多操作,要求在生產系統中外界不能直接連接Redis進行操作,而必須經過程序中轉后,由程序進行操作。
即,redis要求運行在可信的環境中。
redis服務器啟動后,默認允許外界連接,可以修改其配置文件的bind,配置只能有一個路徑進行連接,如bind 127.0.0.1,只允許本機連接。bind只能配置一個ip,因此設置應在防火牆中進行。
2、密碼
配置文件中有requirepass,可以設置密碼。則每次連接上之后,需要先用AUTH 密碼,驗證后再進行操作。但是由於redis性能極高,因此有可能會被攻擊者用窮舉法破解,因此密碼要設置的盡量復雜。
如果主從結構的主庫設置了密碼,從庫要在配置文件中的masterauth中,輸入密碼,以便從庫正常連上主庫。
3、命令修改
redis支持在配置文件對命令進行重命名,如flushall會清空redis,可以在配置文件中輸入rename-command FLUSHALL xxxxx,這個xxxxx應該設置的足夠復雜,則要使用flushall,必須用xxxxx來代替。如果要禁用命令,直接rename成空字符串即可。
二、通信協議
redis支持兩種通信協議:一是二進制安全的統一請求協議;二是比較直觀的便於在程序中直接輸入的telnet協議。這兩種命令的接收到的返回值一樣。
1、telnet
當使用telnet連接上redis服務器后,可以像redis-cli那樣對redis輸入命令,不過接收到的redis返回是原生的返回,而不是redis-cli上看到的返回。
1)狀態回復
以加號+開頭,后面跟上狀態信息,\r\n結尾,如+OK\r\n。
2)錯誤回復
以減號-開頭,后面跟上錯誤信息,以\r\n結尾。
3)整數回復
以冒號:開頭,后面跟上數字,\r\n結尾。
4)字符串回復
以美元$開頭,后面跟上字符串的長度,然后是\r\n,字符串內容,\r\n。
如$5\r\nHello\r\n。如果鍵沒有設定,在redis-cli返回nil,在此則會返回$-1,以和空字符串區別。
5)多行字符串回復
以*開頭,跟上字符串的個數,加上\r\n,后面就是和字符串回復一樣。
如*2\r\n$5\r\nHello\r\n$5\r\nWorld\r\n。
2、統一請求協議
統一請求協議的請求方式,和telnet里面收到的redis的多行字符串回復一樣,先是字符串的個數,接下來是每個字符串的長度和具體內容,並且每個都用\r\n分隔開。
例如redis-cli里面輸入get key,則發送的是*3\r\n$3\r\nget\r\n$3\r\nkey\r\n。
統一請求協議收到的返回值和telnet一致。
redis的AOF文件和主從復制中的主數據庫向從數據庫發送內容,都采用統一請求協議。
三、管理工具
1、基本工具——redis-cli
1)耗時命令查詢
通過配置文件,可以配置執行redis的命令超過多長時間時,記錄執行的命令等信息共開發人員分析,配置參數slowlog-log-slower-than 微秒。1秒是106微秒,參數默認值是104,即超過0.01秒的執行命令都會計入log。
用slowlog get獲取當前的耗時命令的日志,每個日志由4部分組成:日志唯一id、命令開始執行的unix時間、命令執行耗時(微秒)、完整命令及參數。
當設置為0則記錄所有命令,設置為負數則關閉。
2)命令監控
MONITOR。輸入此命令后,會收到redis返回的OK。此后,任意客戶端對此redis服務器進行的操作,都會在此輸出。這樣非常耗性能(消耗將近一半的負載),因此只用於調試和糾錯。
有基於monitor開發的開源腳本redis-faina.py,可以分析在服務器上最常用的命令、最頻繁使用的鍵等信息。
2、phpRedisAdmin
該工具類似phpmyadmin,是用php開發的redis監控管理工具。其依賴於PRedis,因此需要先安裝PRedis,再安裝phpRedisAdmin。
默認連到127.0.0.1:6379,可以在項目include文件夾的config.inc.php進行修改。
配置好nginx和php后,把phpredisadmin放到網站根目錄即可訪問。phpredisadmmin將redis的鍵以樹型展開,點擊某個鍵可以查看鍵的值、鍵的類型、鍵的過期時間、鍵的大小、鍵的編碼方式等,還可以編輯。
由於該工具采用keys*命令獲取鍵,再對每個鍵采用TYPE獲取類型,而redis又是單線程的,因此這樣效率不高,不適合在生產環境使用。
3、Rdbtools
這個工具是redis的文件快照(rdb文件)的解析器,根據快照的rdb文件,將其導出成json文件,分析每個鍵占用空間情況。另外,可以導出到csv,並且可以從csv導入到excel,對結果進行分析。