首先我们使用普通的redisTemplate进行操作
https://blog.csdn.net/weixin_38336658/article/details/79034267
配置完之后,思考下为啥PipeLine可以优化redis的性能?什么时候使用?
redis是单线程的,io多路复用,它需要在前一个请求处理完成之后,再处理下一个请求。如果说有很多请求忽然发送过来,那么也会影响redis的性能,PipeLine可以解决这个问题,也就是批量处理时使用
redisTemplate.executePipelined(new SessionCallback<List>() {
@Override
public <K, V> List execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
List list=new ArrayList();
for (int i = 0; i < 10000; i++) {
String key = "123" + i;
list.add(redisTemplate.opsForValue().get(key));
}
return null;
}
});
必须return null,不然会报错。上面程序是什么意思呢?它会返回查询到的结果添加到list里面。
下面比较下一般的查询还有PipeLine查询的速度
@RestController
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("redis")
public List a(){
/*for (int i = 0; i < 100000; i++) {
String key = "123" + i;
redisTemplate.opsForValue().set(key,i);
}*/
long t1=System.currentTimeMillis();
List list=redisTemplate.executePipelined(new SessionCallback<List>() {
@Override
public <K, V> List execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
List list=new ArrayList();
for (int i = 0; i < 10000; i++) {
String key = "123" + i;
list.add(redisTemplate.opsForValue().get(key));
}
return null;
}
});
long t2=System.currentTimeMillis();
System.out.println("耗时:"+(t2-t1));
long t3=System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
String key = "123" + i;
list.add(redisTemplate.opsForValue().get(key));
}
long t4=System.currentTimeMillis();
System.out.println("耗时:"+(t4-t3));
return list;
}
}
结果:
耗时:757
耗时:1315
很明显批量操作的时候使用PipiLine可以很好提升redis的处理性能