redis 管道
Redis是基于请求/响应协议的TCP服务,在客户端向服务器发送一个查询请求后,需要监听Socket的返回,该监听过程一直阻塞,知道服务器有结果返回,由于Redis集群是部署在多个服务器上的,所以Redis请求/响应模型在每次请求时都要跨网络在不同的服务器之间传输数据,这样每次查询都存在一定的网络延迟。由于服务器一般采用多线程处理业务,并且内存操作效率很高。所以一次请求延时20MS,则多次请求的网络延迟会不断累加。也就是说,在分布式环境下,Redis的瓶颈主要体现在网络延迟上。
Redis的管道技术指在服务端未响应时,客户端可以继续向服务器发送请求,并最终一次性读取所有服务端的响应。管道技术能够减少客户端和服务器交互的次数,将客户端的请求批量发送给服务端,服务端针对批量请求分别查询并统一回复,能显著提高Redis的性能。
Redis管道技术基于SpringBoot的使用如下:
void executePipelined() {
final List<Object> list = redisTemplate.executePipelined(new RedisCallback<Object>() {
@Nullable
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
//1 打开 Pipline
connection.openPipeline();
//2 执行批量操作
for (int i = 0; i < 1000; i++) {
String key = "key_" + i;
String value = "value_" + i;
// connection.set(key.getBytes(StandardCharsets.UTF_8), value.getBytes(StandardCharsets.UTF_8));
connection.get(key.getBytes(StandardCharsets.UTF_8));
}
//3 返回结果,这里返回null
return null;
// 4 redisTemplate将会把最终结果汇总到外层的list中。
}
});
//5 查看管道批量操作的返回结果
for (Object dateTime : list) {
System.out.println(dateTime);
}
}