背景:
闲聊八卦下,最近在优化系统的性能,通过pinpont分析,发现许多查询在Redis这块耗时特别不稳定,如下图
那么,框架组大佬丢来了一个解决方案,通过Redis Pipeline管道进行操作的话,会提升处理性能,说白了,就是节省请求-响应往返的时间(简称RTT)
揣着对Pipeline的好奇,以及在多大数据量的情况下的使用场景,于是,搭建了下环境写了几行代码测试下它和普通处理的性能
测试环境
1、应用程序和redis集群皆本机开发环境,避免网络延迟,Redis Cluster master节点3个,无slave节点
2、主要测试查询性能,查询type类型为hash的key 1数据,如下所示:
127.0.0.1:6479> hgetall 1
1) "sex"
2) ""
3) "name"
4) "\"yubing\""
5) "id"
6) "1"
7) "age"
8) "22"
测试代码
1、应用配置信息
spring.application.name=exec-data-redis
server.port=8981
#redis连接配置型
spring.redis.database=0
#spring.redis.host=127.0.0.1
#spring.redis.port=6379
#spring.redis.password=
#redis之 jedis配置信息
##连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
##连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
##连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
##连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
##连接超时时间(毫秒)
spring.redis.timeout=1000
spring.redis.cluster.nodes=192.168.197.198:6379,192.168.197.198:6479,192.168.197.198:6579
spring.redis.cluster.max-redirects=2
2、单元代码测试样例
@Test
public void pipelineTest() {
long totalCostTime = 0;
int totalNum = 3000;
for (int num = 0; num < totalNum; num++) {
long startTime = System.currentTimeMillis();
redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
redisConnection.openPipeline();
for (int i = 0; i < 10; i++) {
redisConnection.hashCommands().hGetAll("1".getBytes());
}
return null;
}
});
long costTime = System.currentTimeMillis() - startTime;
totalCostTime += costTime;
Sy