(1) Redis是基于请求/响应协议的TCP服务。在客户端向服务器发送一个查询求其后,需要监听Socket的返回,该监听过程一直阻塞,直到服务器有结果返回。由于Redis集群是部署在多个服务器上的,所以Redis的请求/响应模型在每次请求时都要跨网络在不同服务器之间传输,这样每次查询都纯在一个网络延迟(服务器之间的网络延迟一般在 20ms 左右)。由于服务器一般都采用多线程处理业务,并且内存操作的效率很高,所以如果一次请求延迟 20ms ,则多次请求的网络延迟会不断累加。也就是说,在分布式环境下,Redis的性能瓶颈主要体现在网络延迟上。Redis 请求/响应模型的数据请求,响应如下图所示:
(2)Redis 的管道技术在 "服务器未响应时" , 客户端可以继续向服务器发送请求,并最终一次性读取所有服务端的响应。管道技术能减少客户端和服务器交互的次数,将客户端的请求批量发送给服务器,服务器针对批量数据分别查询并统一回复,能显著提高Redis的性能。Redis管道模型的数据请求流程如下图:
(3) Redis管道技术基于Spring Boot的使用如下:
// Redis Pipeline 执行批量操作,将操作结果返回在list中
List<Object> list = redisTemplate.executePipelined(
new RedisCallback<Object>(){
@Nullable
@Override
public Object doInRedis(RedisConnection connect) throws DataAccessException {
connection.openPipeline(); // 打开Pipeline
for(int i =0;i<10000;i++){
String kye = "key_" + i;
String value = "value_" + i;
connection.set(key.getBytes(),value,getBytes());
}
return null; // 结果返回,这里返回null,
// redisTemplate会将最终结果汇总在外层的List中
}
});
// 查看管道批量操作返回的结果
for (Object item: list){
System.out.println(item);
}
以上伪代码使用redisTemplate.executePipelined()在Spring Boot中实现了基于Redis的管道操作,具体的步骤为: 新建RedisCallback对象并覆写doInRedis();在doInRedis()中通过connection.openPipeline()开启Pipeline操作;在for循环早批量进行Redis数据写操作,最终将批量操作结果返回;