Redis學習(4)-慢查詢分析與RESP協議

慢查詢

Redis慢查詢分析

與MySQL一樣:當執行時間超過極大值時,會將發生時間、耗時、 命令記錄;

redis命令生命週期:發送 排隊 執行 返回,慢查詢只統計第3個執行步驟的時間

Redis如何設置

  1. 動態設置6379:> config set slowlog-log-slower-than 10000 //10毫秒
    使用config set完後,若想將配置持久化保存到redis.conf,要執行config rewrite ;前提是你根據redis.conf 執行

  2. 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性能測試(在外部請求)

  1. redis-benchmark -h 192.168.42.111 -p 6379 -c 100 -n 10000
    100個併發連接,10000個請求,檢測服務器性能
  2. redis-benchmark -h 192.168.42.111 -p 6379 -q -d 100
    測試存取大小爲100字節的數據包的性能
  3. redis-benchmark -h 192.168.42.111 -p 6379 -t set,get -n 100000 -q
    只測試 set,lpush操作的性能
  4. 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)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章