·慢查詢分析:通過慢查詢分析,找到有問題的命令進行優(yōu)化。
·Redis Shell:功能強大的Redis Shell會有意想不到的實用功能。
·Pipeline:通過Pipeline(管道或者流水線)機制有效提高客戶端性能。
·事務與Lua:制作自己的專屬原子命令。
·Bitmaps:通過在字符串數(shù)據(jù)結構上使用位操作,有效節(jié)省內存,為開
發(fā)提供新的思路。
·HyperLogLog:一種基于概率的新算法,難以想象地節(jié)省內存空間。
·發(fā)布訂閱:基于發(fā)布訂閱模式的消息通信機制。
·GEO:Redis3.2提供了基于地理位置信息的功能。
3.1 慢查詢分析
Redis提供了slowlog-log-slower-than和slowlog-max-len配置來解決這兩個問題。從字面意思就可以看出,slowlog-log-slower-than就是那個預設閥值,它的單位是微秒(1秒=1000毫秒=1000000微秒),默認值是10000,假如執(zhí)行了一條“很慢”的命令(例如keys*),如果它的執(zhí)行時間超過了10000微秒,那么它將被記錄在慢查詢日志中。
如果slowlog-log-slower-than=0會記錄所有的命令,slowlog-log-slower-than<0對于任何命令都不會進行記錄。從字面意思看,slowlog-max-len只是說明了慢查詢日志最多存儲多少條,并沒有說明存放在哪里?實際上Redis使用了一個列表來存儲慢查詢日志,slowlog-max-len就是列表的最大長度。一個新的命令滿足慢查詢條件時被插入到這個列表中,當慢查詢日志列表已處于其最大長度時,最早插入的一個命令將從列表中移出,例如slowlog-max-len設置為5,當有第6條慢查詢插入的話,那么隊頭的第一條數(shù)據(jù)就出列,第6條慢查詢就會入列。
在Redis中有兩種修改配置的方法,一種是修改配置文件,另一種是使用config set命令動態(tài)修改。例如下面使用config set命令將slowlog-log-slower-than設置為20000微秒,slowlog-max-len設置為1000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
slowlog get
slowlog len
slowlog reset
3.2 Redis Shell
redis-cli詳解:
redis-cli --help查看幫助
-r(repeat)選項代表將命令執(zhí)行多次
-i(interval)選項代表每隔幾秒執(zhí)行一次命令
-a(auth)選項,有了這個選項就不需要手動輸入auth命令
--scan選項和--pattern選項用于掃描指定模式的鍵,相當于使用scan命令
-slave選項是把當前客戶端模擬成當前Redis節(jié)點的從節(jié)點,可以用來獲取當前Redis節(jié)點的更新操作
--rdb選項會請求Redis實例生成并發(fā)送RDB持久化文件,保存在本地??墒褂盟龀志没募亩ㄆ趥浞?/p>
--pipe選項用于將命令封裝成Redis通信協(xié)議定義的數(shù)據(jù)格式,批量發(fā)送給Redis執(zhí)行
--bigkeys選項使用scan命令對Redis的鍵進行采樣,從中找到內存占用比較大的鍵值,這些鍵可能是系統(tǒng)的瓶頸
--eval選項用于執(zhí)行指定Lua腳本
--latency、--latency-history、--latency-dist。它們都可以檢測網(wǎng)絡延遲,對于Redis的開發(fā)和運維非常有幫助
--stat選項可以實時獲取Redis的重要統(tǒng)計信息,雖然info命令中的統(tǒng)計信息更全,但是能實時看到一些增量的數(shù)據(jù)(例如requests)對于Redis的運維還是有一定幫助的
--no-raw選項是要求命令的返回結果必須是原始的格式,--raw恰恰相反,返回格式化后的結果。如果使用了--raw選項,將會返回中文,原始格式。
redis-server詳解:
redis-server --test-memory可以用來檢測當前操作系統(tǒng)能否穩(wěn)定地分配指定容量的內存給Redis。
redis-benchmark詳解:
-c(clients)選項代表客戶端的并發(fā)數(shù)量(默認是50)
-n(num)選項代表客戶端請求總量(默認是100000)
例如redis-benchmark-c100-n20000代表100各個客戶端同時請求Redis,一共執(zhí)行20000次。redis-benchmark會對各類數(shù)據(jù)結構的命令進行測試,并給出性能指標。
-q選項僅僅顯示redis-benchmark的requests per second信息
使用-r(random)選項,可以向Redis插入更多隨機的鍵
-P選項代表每個請求pipeline的數(shù)據(jù)量(默認為1)
-k選項代表客戶端是否使用keepalive,1為使用,0為不使用,默認值1
-t選項可以對指定命令進行基準測試
--csv選項會將結果按照csv格式輸出,便于后續(xù)處理,如導出到Excel等
3.3 Pipeline
Pipeline(流水線)機制能改善上面這類問題,它能將一組Redis命令進行組裝,通過一次RTT傳輸給Redis,再將這組Redis命令的執(zhí)行結果按順序返回給客戶端。
原生批量命令與Pipeline對比:
·原生批量命令是原子的,Pipeline是非原子的。
·原生批量命令是一個命令對應多個key,Pipeline支持多個命令。
·原生批量命令是Redis服務端支持實現(xiàn)的,而Pipeline需要服務端和客戶端的共同實現(xiàn)。
3.4 事務與Lua
Redis提供了簡單的事務功能,將一組需要一起執(zhí)行的命令放到multi和exec兩個命令之間。multi命令代表事務開始,exec命令代表事務結束,它們之間的命令是原子順序執(zhí)行的。Redis提供了簡單的事務,之所以說它簡單,主要是因為它不支持事務中的回滾特性,同時無法實現(xiàn)命令之間的邏輯關系計算。
Lua語言是在1993年由巴西一個大學研究小組發(fā)明,其設計目標是作為嵌入式程序移植到其他應用程序,它是由C語言實現(xiàn)的,Redis將Lua作為腳本語言可幫助開發(fā)者定制自己的Redis命令。
在Redis中執(zhí)行Lua腳本有兩種方法:eval和evalsha。
3.5 Bitmaps
·Bitmaps本身不是一種數(shù)據(jù)結構,實際上它就是字符串(如圖3-10所示),但是它可以對字符串的位進行操作。
·Bitmaps單獨提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同??梢园袯itmaps想象成一個以位為單位的數(shù)組,數(shù)組的每個單元只能存儲0和1,數(shù)組的下標在Bitmaps中叫做偏移量。
3.6 HyperLogLog
HyperLogLog并不是一種新的數(shù)據(jù)結構(實際類型為字符串類型),而是一種基數(shù)算法,通過HyperLogLog可以利用極小的內存空間完成獨立總數(shù)的統(tǒng)計,數(shù)據(jù)集可以是IP、Email、ID等。HyperLogLog提供了3個命令:pfadd、pfcount、pfmerge。
3.7 發(fā)布訂閱
publish channel message
subscribe channel [channel ...]
·客戶端在執(zhí)行訂閱命令之后進入了訂閱狀態(tài),只能接收subscribe、psubscribe、unsubscribe、punsubscribe的四個命令。
·新開啟的訂閱客戶端,無法收到該頻道之前的消息,因為Redis不會對發(fā)布的消息進行持久化。
和很多專業(yè)的消息隊列系統(tǒng)(例如Kafka、RocketMQ)相比,Redis的發(fā)布訂閱略顯粗糙,例如無法實現(xiàn)消息堆積和回溯。但勝在足夠簡單,如果當前場景可以容忍的這些缺點,也不失為一個不錯的選擇。
3.8 GEO
Redis3.2版本提供了GEO(地理信息定位)功能,支持存儲地理位置信息用來實現(xiàn)諸如附近位置、搖一搖這類依賴于地理位置信息的功能,對于需要實現(xiàn)這些功能的開發(fā)者來說是一大福音。