SpringBoot项目中Redis之管道技术

环境:springboot2.3.9.RELEASE + redis3.2.100


Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
  • 服务端处理命令,并将结果返回给客户端。

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倍多。

完毕!!!

给个关注+转发呗谢谢

使用Spring Boot Admin实时监控你的系统

SpringBoot邮件发送示例

SpringBoot项目查看线上日志

SpringBoot多数据源配置详解

springboot mybatis jpa 实现读写分离

SpringBoot RabbitMQ消息可靠发送与接收

SpringBoot开发自己的Starter

举报
评论 0