
기존 팀 프로젝트인 shopping을 리팩토링한 쇼핑몰 프로젝트
온라인 쇼핑몰에서 볼수 있는 이벤트 상품, 인기 상품, 일일 인기 상품 노출 전략을 Redis로 구현
ZSET(key, value, score) : Redis 자료구조 중 하나로 정렬된 집합(Sorted Set)을 의미합니다.
예시
ZINCRBY product:views 1 product:1 ZINCRBY product:views 3 product:2 ZINCRBY product:views 10 product:3
key Member(value) Score product:views product:1 1 product:views product:2 3 product:views product:3 10
Redis 명령어 기능 Java(Spring Data Redis) 코드 예시 ZADD새 원소 추가 (score와 함께) opsForZSet().add(key, value, score);ZINCRBY특정 원소의 score 증가 opsForZSet().incrementScore(key, value, delta);ZRANGE낮은 score 순으로 조회 opsForZSet().range(key, start, end);ZREVRANGE높은 score 순으로 조회 (랭킹) opsForZSet().reverseRange(key, start, end);ZREVRANGE WITHSCORES높은 score 순 + 점수 함께 조회 opsForZSet().reverseRangeWithScores(key, start, end);ZREM특정 원소 삭제 opsForZSet().remove(key, value);
Batch update는 데이터베이스에서 한 번에 여러 데이터를 효율적으로 수정(update)하는 방법입니다.
주로 다수의 저장, 업데이트가 한 번의 쿼리로 이루어지지 않을 때 사용합니다.
JDBC을 이용한 방법이 가장 일반적
Batch Update 장점
Batch Update 주의점
Redis에 TTL 기능을 이용해 AccessToken과 RefreshToken을 만료 시 자동 삭제되도록 설계하여 보안과 관리 측면에서 편리하도록 하였고 트래픽이 몰리는 경우 메모리 기반의 Redis가 DB보다 데이터를 빠르게 읽어 성능상 유리할 것으로 판단하여 사용했습니다.
사용자가 상품을 조회할 때마다 DB를 갱신하면 성능 부담이 크므로 메모리 기반 Redis를 활용하여 조회 수를 빠르게 증가시키고 랭킹을 실시간으로 조회할 수 있도록 설계했습니다. 또한 ZSET을 이용하여 정렬 기능을 활용하여 랭킹 조회를 효율적으로 처리하였습니다.
스프링 스케줄링 어노테이션 @Scheduled(cron = "0 0 0 * * *")을 활용하여 자정마다 Redis에 저장된 데이터를 DB로 업데이트 합니다.
ZSET을 통해 data를 꺼내고 이 때 발생하는 대량의 Redis 데이터를 DB에 반영할 때 한 번에 여러 쿼리를 실행하도록 BatchUpdate를 활용했습니다.
이로 인해 DB 부하를 줄이고 트랜잭션 부담을 낮추며 최종적으로 일관성 있는 데이터 처리를 보장하였습니다.
이벤트 상품은 조회가 많은 기능임으로 Redis 캐시로 저장 후 조회 성능을 최적화했습니다.