環境:SpringBoot2.6.12 + redis6
Redis是一種基于客戶端-服務端模型以及請求/響應協議的TCP服務。這意味著通常情況下一個請求會遵循以下步驟:
- 客戶端向服務端發送一個查詢請求,并監聽Socket返回,通常是以阻塞模式,等待服務端響應。
- 服務端處理命令,并將結果返回給客戶端。
Redis 管道技術
Redis管道技術是一種批處理技術,用于一次性處理多個Redis命令,從而提高整個交互的性能。通常情況下,Redis是單行執行的,當客戶端向服務器發送請求時,服務端接收并處理請求后再把結果返回給客戶端。然而,當出現集中大批量的請求時,每個請求都需要經歷先請求再響應的過程,這會造成網絡資源浪費。此時,管道技術應運而生,它把所有的命令整合一次發給服務端,再一次響應給客戶端,從而大大提高了Redis的響應速度。
Redis普通請求模型與管道請求模型對比
(普通請求模型)來源網絡
RTT(Round-Trip Time),就是往返時延,在計算機網絡中它是一個重要的性能指標,表示從發送端發送數據開始,到發送端收到來自接收端的確認(接收端收到數據后便立即發送確認),總共經歷的時延。
一般認為,單向時延 = 傳輸時延t1 + 傳播時延t2 + 排隊時延t3
(管道請求模型)來源網絡
性能對比
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置文件
spring:
redis:
host: localhost
port: 6379
password: ******
database: 4
lettuce:
pool:
maxActive: 8
maxIdle: 100
minIdle: 10
maxWAIt: -1
普通方法
@Resource
private StringRedisTemplate stringRedisTemplate ;
public void execNormal() {
long start = System.currentTimeMillis() ;
for (int i = 0; i < 100_000; i++) {
stringRedisTemplate.opsForValue().set("k" + i, "v" + i) ;
}
System.out.println("耗時:" + (System.currentTimeMillis() - start) + " ms") ;
}
測試結果
總耗時:47秒左右
管道技術
public void execPipeline() {
long start = System.currentTimeMillis() ;
stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for (int i = 0; i < 100_000; i++) {
connection.set(("pk" + i).getBytes(), ("pv" + i).getBytes()) ;
}
return null ;
}
}) ;
System.out.println("耗時:" + (System.currentTimeMillis() - start) + " ms") ;
}
測試結果
耗時:13秒左右,性能提升了3倍多。