目錄
一、Redis運行原理
二、redis執行協議
RESP協議
模擬resp協議進行redis寫入
三、redis性能測驗
Redis慢查詢分析
Redis慢查詢極值設定
慢查詢原理
慢查詢命令
一、Redis運行原理
redis服務器對命令的處理都是單執行緒的,但是I/O層面卻面向多個客戶端并發地提供服務,并發到內部單執行緒的轉化通過多路復用框架來實作,redis命令從發送到執行經理以下四個程序
- 發送命令
- 命令排隊
- 命令執行
- 結果回傳

二、redis執行協議
對redis請求進行抓包,查看抓包內容
1、執行抓包命令

2、查看抓包內容
redis協議位于TCP層之上,即客戶端和redis實體保持雙工的連接,互動的都是序列化后的協議資料
RESP協議
Redis 服務器與客戶端通過RESP(REdis Serialization Protocol)協議通信,
RESP 底層采用的是TCP 的連接方式,通過tcp 進行資料傳輸,然后根據決議規則決議相應資訊,完成互動,
我們可以測驗下,首先運行一個serverSocket 監聽6379,來接收redis 客戶端的請求資訊,實作如下
1、建立socket連接監聽6379埠,用于接收請求并輸出
/**
* /**
* <p>模擬redis</p>
*
* @author DK
* @version V1.0
*/
public class SimulatedRedis {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(6379);
Socket rec = server.accept();
byte[] result = new byte[2048];
rec.getInputStream().read(result);
System.out.println(new String(result));
}
}
2、使用jedis客戶度端請求本地6379埠
/**
* /**
* <p>模擬redis</p>
*
* @author DK
* @version V1.0
*/
public class SimulatedRedisClient {
public static void main(String[] args) throws IOException {
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("user:2", "9999");
jedis.close();
}
}
列印輸出

發現和抓包內容一致
每個欄位標示含義為:
*3 表示有幾組資料
$ 3 表示set長度為3
Set 命令
$6 表示key長度為6
User:2 key
$1 表示value長度為1
2 value
主要以下特點:從上述實體中發現,redis使用resp協議的好處為容易實作,決議快,人類可讀,并且傳輸在TCP層,可以減少不必要的資訊傳輸
模擬resp協議進行redis寫入
/**
* /**
* <p>模擬redis</p>
*
* @author DK
* @version V1.0
*/
public class RespRedis {
public static void main(String[] args) {
SocketAddress addr = new InetSocketAddress("10.1.253.188", 6379);
Socket sk = new Socket();
try {
sk.connect(addr);
OutputStream out = sk.getOutputStream();
StringBuffer sb = new StringBuffer();
sb.append("*3\r\n");
sb.append("$3\r\n");
sb.append("SET\r\n");
sb.append("$6\r\n");
sb.append("user:0\r\n");
sb.append("$5\r\n");
sb.append("11111\r\n");
System.out.println(sb.toString());
byte[] b = sb.toString().getBytes();
out.write(b);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、redis性能測驗
Redis慢查詢分析
mysql一樣:當執行時間超過極大值時,會將發生時間 耗時 命令記錄
redis命令生命周期:發送 排隊 執行 回傳,慢查詢只統計第3個執行步驟的時間
Redis慢查詢極值設定
一般有兩種方式,默認時間為10ms
1、命令方式
config set slowlog-log-slower-than 10000 //10毫秒
使用config set完后,若想將配置持久化保存到redis.conf,要執行config rewrite
2、組態檔修改
redis.conf修改:找到slowlog-log-slower-than 10000 ,修改保存即可
注意:slowlog-log-slower-than =0記錄所有命令 -1命令都不記錄
慢查詢原理
慢查詢記錄也是存在佇列里的,slow-max-len 存放的記錄最大條數,
比如設定的slow-max-len=10,當有第11條慢查詢命令插入時,佇列的第一條命令
就會出列,第11條入列到慢查詢佇列中, 可以config set動態設定,
也可以修改redis.conf完成配置
慢查詢命令
獲取佇列里慢查詢的命令:slowlog get
獲取慢查詢串列當前的長度:slowlog len //以上只有1條慢查詢,回傳1;
1),對慢查詢串列清理(重置):slowlog reset //再查slowlog len 此時回傳0 清空;
2),對于線上slow-max-len配置的建議:線上可加大slow-max-len的值,記錄慢查詢存長命令時redis會做截斷,不會占用大量記憶體,線上可設定1000以上
3),對于線上slowlog-log-slower-than配置的建議:默認為10毫秒,根據redis并發量來調整,對于高并發比建議為1毫秒
4),慢查詢是先進先出的佇列,訪問日志記錄出列丟失,需定期執行slowlog get,將結果存盤到其它設備中(如mysql)
1、redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 10000
100個并發連接,10000個請求,檢測服務器性能

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/122159.html
標籤:其他
