redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。 由于网络开销延迟,即算redis server端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须部分请求放到队列中(使用内存)执行完毕后一次性发送结果;如果发送的命名很多的话,建议对返回的结果加标签,当然这也会增加使用的内存。
pipeline:可将命令合并为一次IO,可降低延迟。
本机测试redis-pipeline
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void redisPipelineTest() {
System.out.println("未使用管道管道执行前" + System.currentTimeMillis());
for (int i = 0; i < 1000; i++) {
stringRedisTemplate.opsForValue().set("not_pipeline" + i, String.valueOf(i));
}
System.out.println("未使用管道执行后" + System.currentTimeMillis());
System.out.println("使用管道执行前" + System.currentTimeMillis());
stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for (int i = 0; i < 10; i++) {
connection.set(("pipeline" + i).getBytes(), String.valueOf(i).getBytes());
}
// 一定要返回null不然会抛出 InvalidDataAccessApiUsageException: Callback cannot return a non-null value as it gets overwritten by the pipeline
return null;
}
});
System.out.println("使用管道执行后" + System.currentTimeMillis());
}
测试结果:
image.png
在本机测试中,pipeline性能比普通set高出很多
网友评论