선착순 쿠폰 이벤트 개발기2 (feat.Redis)

고승원·2023년 3월 21일
1

TIL

목록 보기
10/24

서론

선착순 쿠폰 이벤트 개발기를 진행한 뒤 분산락에 대해서 알게 되어 스핀락보다 분산락이 더 효율적이라는 생각에 redis 클라이언트를 변경해보았다.

설정

gradle 의존성 추가

implementation 'org.redisson:redisson-spring-boot-starter:3.16.8'

bean 등록

@Bean
	public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redissonClient) {
		return new RedissonConnectionFactory(redissonClient);
	}

@Bean
public RedissonClient redissonClient() {
	Config config = new Config();
	config.useSingleServer()
		.setAddress(
			"redis://" + redisProperties.getHost() + ":" + redisProperties.getPort()
		)
		.setPassword(redisProperties.getPassword());
	return Redisson.create(config);
}

레디스에 저장

public long register(CouponEventRegisterRequest couponEventRegisterRequest) {
		return getScoredSortedSet(CouponProperties.getKey())
				.addAndGetRank(System.currentTimeMillis(), couponEventRegisterRequest);
	}

결과

lettuce를 사용했을때

redisson를 사용했을때 tps 20% 증가, 전체 처리량 15%, 최고 tps 30%가량 늘어났다.

마무리

Redis는 Jedis, Lettuce, Redisson등 여러가지 Client가 있는데, Lettuce의 lock 방식은 spin lock이어서 요청이 많아질수록 레디스가 받는 부하가 늘어난다.
반면에 Redisson은 pub/sub 기능을 사용하여 일일이 요청을 보낼 필요 없이lock이 해제될 때까지 기다린 뒤, lock을 획득할 수 있다.

redisson은 lettuce에 비해 레퍼런스가 찾기 어려웠지만, 성능개선이 이루어져서 다행이다.

Todo

매번 12초에 병목이 생기는데 이유를 찾아보자

참고


https://github.com/redisson/redisson

profile
봄은 영어로 스프링

0개의 댓글