하자코딩
118
2019-04-16 11:00:46
2
204

스프링부트 Redis 성능


안녕하세요 스프링부트에서 레디스 성능이 안나오는데 설정할것이 있는지 궁금합니다.!!

윈도우 레디스를 켜놓고 redis-bench.exe 키면 get이 1초에 9~10만Request 처리가능한 것으로 나옵니다.

근데 스프링부트에서 yml에 아무런 설정도 안한 대신 비동기로 1만 번 request날리면 응답이 오는데 0.5초가 걸립니다.

그러면 1초에 약 2만개 Request를 처리해줬다는 얘긴데요...

원하는 성능이 나오려면 어떻게 해야할까요...

비동기로 요청하느 쓰레드풀이 아닌 Redis Connection을 잡고 있는 쓰레드풀을 사용했으면 하는데요... 음...

@RestController
public class TestController {
    private static final Logger logger = LoggerFactory.getLogger(TestController.class);
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private static AtomicInteger count = new AtomicInteger(0);
    
    private ExecutorService executor = Executors.newFixedThreadPool(16);
    @GetMapping("/")
    public void test() {
        ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<>();
        count.set(0);
        long start = 0, end = 0;        
        logger.info("=====================================");
        logger.info("start completableFuture");
        start = System.currentTimeMillis();
        for(int i=0;i<10000;i++) {
            CompletableFuture.runAsync(()->{
            	executor.execute(()->{
            		//hashMap에 put하는 이유는 redis에서 데이터를 잘 가져왔는지 확인 용도로 둠.
            		hashMap.put(""+count.incrementAndGet(), stringRedisTemplate.opsForHash().get("kkk","kkk").toString());            			
            	});
            });
        }
        end = System.currentTimeMillis();
        logger.info("hash size : " + hashMap.size());
        logger.info("end completableFuture, result : " + (end-start) + "ms");
        ///////////////////////////////////////////////////////////////////////////////
        long start1 = 0, end1= 0;
        hashMap.put("hello","world");
        //아래 반복문은 위에서 보낸 Request가 응답이 오기까지 대기하는데 Thread.sleep(300);을 대신하는 용도로 작성
        logger.info("start sync concurrentHashMap");
        start1 = System.currentTimeMillis();
        for(int i=0;i<50000000;i++) {
            hashMap.get("hello");
        }
        end1 = System.currentTimeMillis();
        logger.info("end sync concurrentHashMap, result : "+ (end1-start1) + "ms");
        logger.info("size : " + hashMap.size());
        logger.info("=====================================");
    } 
0
0
  • 답변 2

  • 뒷집할머니
    1k
    2019-04-17 10:51:41

    Pool 갯수 늘려도 비슷한가요?

    0
  • 하자코딩
    118
    2019-04-22 17:06:44

    @뒷집할머니

    autoconfiguration에 의해서 생성되는 디폴트로 사용했고요.

    그럴때만 pool.maxactive 이런설정은 먹는데 차이는 없더라고요.

    제가 connectionFactory를 만들어버리면 yml에서 설정이 먹지 않습니다...

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.