1.非響應式代碼
// 使用reactive 耗時:6.7s 使用mysql-2線程池 redis-2線程池
// 使用常規(guī)的線程池 耗時:13s
@PostMapping(value = "testWrite2Redis")
public Result<Long> testRedis() throws Exception {
final ExecutorService executorService = Executors.newFixedThreadPool(32);
long begin = System.currentTimeMillis();
ValueOperations<String, String> valOpt = redisTemplate.opsForValue();
List<Future<Boolean>> futures = IntStream.range(10, 30000).boxed().map(s ->
executorService.submit(() -> {
try {
valOpt.set(PERFORMANCE_PREFIX + s, "id");
} catch (Exception e) {
log.error("", e);
}
return true;
})).collect(Collectors.toList());
for (Future<Boolean> future : futures) {
try {
future.get();
} catch (Exception e) {
log.error("", e);
}
}
return Result.success(System.currentTimeMillis() - begin);
}
2.響應式代碼
// 使用reactive 耗時:6.7s 使用mysql-2線程池 redis-2線程池
@PostMapping(value = "reactiveTestWrite2Redis")
public Mono<Result<Long>> reactiveTestWrite2Redis() {
long start = System.currentTimeMillis();
ReactiveValueOperations<String, String> valOpt = r2redisTemplate.opsForValue();
final Mono<Long> longMono = Flux.range(10, 30000)
.flatMap(s ->
valOpt.set(PERFORMANCE_PREFIX + s, String.valueOf(s))
.flatMap(e -> {
//log.info("set id={}, done", s);
return Mono.just(s);
}))
.count()
.flatMap(s -> {
log.info("finish ...");
return Mono.just(System.currentTimeMillis() - start);
});
return Result.success(longMono);
}
性能截圖:
非響應式
響應式
總結:
在這個場景下,性能快2倍副砍。如果是io延遲更高的情況下,差距會更加明顯。