慢查詢
Redis慢查詢分析
與MySQL一樣:當執行時間超過極大值時,會將發生時間、耗時、 命令記錄;
redis命令生命週期:發送 排隊 執行 返回,慢查詢只統計第3個執行步驟的時間
Redis如何設置
-
動態設置6379:> config set slowlog-log-slower-than 10000 //10毫秒
使用config set完後,若想將配置持久化保存到redis.conf,要執行config rewrite ;前提是你根據redis.conf 執行 -
redis.conf修改:找到slowlog-log-slower-than 10000 ,修改保存即可
注意:slowlog-log-slower-than =0記錄所有命令 -1命令都不記錄
Redis慢查詢原理
慢查詢記錄也是存在隊列裏的,slow-max-len 存放的記錄最大條數,比如設置的slow-max-len=10,當有第11條慢查詢命令插入時,隊列的第一條命令就會出列,第11條入列到慢查詢隊列中, 可以config set動態設置,也可以修改redis.conf
獲取隊列裏慢查詢的命令:slowlog get
獲取慢查詢列表當前的長度:slowlog len
對慢查詢列表清理(重置):slowlog reset
對於線上slow-max-len配置的建議:線上可加大slow-max-len的值,記錄慢查詢存 長命令時redis會做截斷,不會佔用大量內存,線上可設置1000以上
對於線上slowlog-log-slower-than配置的建議:默認爲10毫秒,根據redis併發量來調整,對於高併發比建議爲1毫秒
慢查詢是先進先出的隊列,訪問日誌記錄出列丟失,需定期執行slowlog get,將結果 存儲到其它設備中
Redis性能測試(在外部請求)
- redis-benchmark -h 192.168.42.111 -p 6379 -c 100 -n 10000
100個併發連接,10000個請求,檢測服務器性能 - redis-benchmark -h 192.168.42.111 -p 6379 -q -d 100
測試存取大小爲100字節的數據包的性能 - redis-benchmark -h 192.168.42.111 -p 6379 -t set,get -n 100000 -q
只測試 set,lpush操作的性能 - redis-benchmark -h 192.168.42.111 -p 6379 -n 100000 -q script load “redis.call(‘set’,‘foo’,‘bar’)”
只測試某些數值存取的性能
RESP協議
Redis服務器與客戶端通過RESP(Redis Protocol specification)協議通信 (aof 文件就是通過RESP存儲的)
- Simple to implement.
- Fast to parse.
- Human readable.
好實現、解析快、易於理解
set test 5 我執行了這個命令 產生的RESP 可以在aof文件裏面查看
*3 -----表示後面有幾組數據 set test 5 所以就是3
$3 -----set 的長度 爲3
set -----執行的命令
$4 -----test的長度 爲4
test ----執行的命令
$1 ----5的長度
5 ----執行的命令
應用
我們可以通過這個在客戶端產生成這樣的數據通過socket連接redis 發送給他(jedis客戶端的原理就是這樣)
我們也可以通過把數據庫數據查詢出來格式化成resp的格式請求redis(就做到了備份數據庫)
mysql -utest -ptest stress --default-character-set=utf8 --skip-column-names --raw < order.sql | redis-cli -h 192.168.42.111 -p 6379 -a 12345678 --pipe
1. 使用用戶名和密碼登陸連接數據庫
2. 登陸成功後執行order.sql的select語句得到查詢結果集result
3. 使用密碼登陸Redis
4. Redis登陸成功後, 使用PIPE管道將result導入Redis.
PIPELINE操作流程
大多數情況下,我們都會通過請求-相應機制去操作redis。只用這種模式的一般的步驟是,先獲得jedis實例,然後通過jedis的get/put方法與redis交互。由於redis是單線程的,下一次請求必須等待上一次請求執行完成後才能繼續執行。然而使用Pipeline模式,客戶端可以一次性的發送多個命令,無需等待服務端返回。這樣就大大的減少了網絡往返時間,提高了系統性能。但是要用好、用對還是得深度學習
流程
使用PIPELINE可以解決網絡開銷的問題
原理也非常簡單,流程如下, 將多個指令打包後,一次性提交到Redis, 網絡通信只有一次
2112622647)]
原理也非常簡單,流程如下, 將多個指令打包後,一次性提交到Redis, 網絡通信只有一次
[外鏈圖片轉存中…(img-PbgNXhLh-1582112622648)]