Redis 활용

이동근·2025년 12월 2일

custom-shopping

목록 보기
1/3
post-thumbnail

custom-shopping Project

  • 기존 팀 프로젝트인 shopping을 리팩토링한 쇼핑몰 프로젝트

  • 온라인 쇼핑몰에서 볼수 있는 이벤트 상품, 인기 상품, 일일 인기 상품 노출 전략을 Redis로 구현

    • 조회 수를 캐시 저장소 Redis를 통해 관리

Redis 사용

ZSET

  • ZSET(key, value, score) : Redis 자료구조 중 하나로 정렬된 집합(Sorted Set)을 의미합니다.

    • ZSET은 하나의 key에 여러 member와 score를 저장할 수 있습니다.

예시

ZINCRBY product:views 1 product:1
ZINCRBY product:views 3 product:2
ZINCRBY product:views 10 product:3
keyMember(value)Score
product:viewsproduct:11
product:viewsproduct:23
product:viewsproduct:310
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);

BatchUpdate

  • Batch update는 데이터베이스에서 한 번에 여러 데이터를 효율적으로 수정(update)하는 방법입니다.

    • 주로 다수의 저장, 업데이트가 한 번의 쿼리로 이루어지지 않을 때 사용합니다.

    • JDBC을 이용한 방법이 가장 일반적

  • Batch Update 장점

    • 성능 개선 , 트랜잭션 효율화 , 메모리 관리
  • Batch Update 주의점

    • 메모리 과부하가 발생할 수 있으니 적절한 batchsize가 필요

Project에서 사용내용

User 파트에서 AccessToken, RefreshToken을 관리하기 위해 사용

Redis에 TTL 기능을 이용해 AccessToken과 RefreshToken을 만료 시 자동 삭제되도록 설계하여 보안과 관리 측면에서 편리하도록 하였고 트래픽이 몰리는 경우 메모리 기반의 Redis가 DB보다 데이터를 빠르게 읽어 성능상 유리할 것으로 판단하여 사용했습니다.

일일 조회 수 증가와, 일일 랭킹 조회(TOP10)을 위해 ZSET을 사용

사용자가 상품을 조회할 때마다 DB를 갱신하면 성능 부담이 크므로 메모리 기반 Redis를 활용하여 조회 수를 빠르게 증가시키고 랭킹을 실시간으로 조회할 수 있도록 설계했습니다. 또한 ZSET을 이용하여 정렬 기능을 활용하여 랭킹 조회를 효율적으로 처리하였습니다.

일일 조회 수를 DB 반영하기 위해 ZSET과 BatchUpdate를 사용

스프링 스케줄링 어노테이션 @Scheduled(cron = "0 0 0 * * *")을 활용하여 자정마다 Redis에 저장된 데이터를 DB로 업데이트 합니다.

ZSET을 통해 data를 꺼내고 이 때 발생하는 대량의 Redis 데이터를 DB에 반영할 때 한 번에 여러 쿼리를 실행하도록 BatchUpdate를 활용했습니다.

이로 인해 DB 부하를 줄이고 트랜잭션 부담을 낮추며 최종적으로 일관성 있는 데이터 처리를 보장하였습니다.

이벤트 상품 추가할 경우 Redis 사용

이벤트 상품은 조회가 많은 기능임으로 Redis 캐시로 저장 후 조회 성능을 최적화했습니다.

profile
안녕하세요

0개의 댓글