Redis를 배워보자!!- (1)

NTbell·2025년 2월 1일

Redis 개요 🚀

Redis란?

  • Remote Dictionary Server의 약자로, 고성능의 키-값(Key-Value) 저장소
  • 데이터를 메모리에 저장하여 빠른 읽기/쓰기 속도 제공
  • 주요 활용처: 캐싱, 인증 관리, DB 동시성 제어

Redis 주요 특징

1. Key-Value 기반 데이터 저장

  • SQL처럼 복잡한 쿼리 없이 간단한 명령어로 데이터 처리 가능

2. 빠른 성능 🚀

  • 인메모리(In-Memory) NoSQL DB로 빠른 데이터 처리 가능
    • RDB는 디스크에 저장 후 필요 시 메모리에 캐싱하는 방식 → Redis가 훨씬 빠름
    • Redis는 메모리상의 데이터를 주기적으로 디스크에 스냅샷 저장하여 복구 가능
  • 해시 테이블 기반으로 빠른 검색 지원

3. 싱글 스레드 구조

  • 동시성 이슈 없음 → 한 번에 하나의 요청을 처리하여 데이터 충돌 방지

Redis 데이터베이스 (0~15번까지 구성)

  • Redis는 기본적으로 16개의 데이터베이스(0~15번)를 제공
  • MySQL처럼 여러 개의 DB를 만들고 관리할 필요 없이 번호로 선택해서 사용 가능
  • select DB번호 명령어로 특정 DB 선택 가능
select 1  # 1번 DB 선택
keys *    # 현재 DB의 모든 키 조회

String 구조

1. 데이터 저장

SET key value
SET user:email:1 user1@gmail.com
  • Key: user:email:1
  • Value: user1@gmail.com

2. 데이터 조회

GET key *
GET user:email:1

3. NX 옵션 (값이 존재하지 않을 경우만 저장)

SET user:email:2 user2@gmail.com NX
  • 기존 데이터가 있으면 저장하지 않음

4. EX(expiration) : 만료시간(초단위) 옵션

SET user:email:3 user3@gmail.com EX 10
  • 10초 후 데이터 자동 삭제** (TTL 설정 가능)
TTL user:email:3  # 남은 만료 시간 확인

Redis 활용: 사용자 인증정보 저장 (Refresh 토큰 관리)

보통 redis에 re-fresh 토큰을 저장해둔다

먼저 서버는 RDB에서 가서 조회하지 않고 redis에 있는지 확인을 함
그 다음 RDB에서 크로스 체크해서 맞으면 사용자한테 그 요청정보를 허락하고 웹서비스 화면데 보여줌!!

이유 : RDB에서 찾으면 시간이 너무 오래걸리기 때문에 redis사용시 빠르게 조회가능!

동작 과정

  1. 토큰 생성 및 저장

    • 사용자가 로그인하면 Access Token + Refresh Token 생성
    • Refresh Token에는 **만료 시간(exp 필드)**이 설정됨
    • 생성된 Refresh Token을 Redis에 저장하면서, Redis의 TTL도 동일한 만료 시간으로 설정
    SET user:1:refresh_token asdf23fddfa EX 604800  # 7일 TTL 설정
  2. 토큰 사용 및 검증

    • 액세스 토큰이 만료되었을 때, 사용자는 Refresh Token을 이용해 새 액세스 토큰을 요청
    • 서버는 먼저 Redis에서 Refresh Token을 조회하고, TTL이 만료되지 않았는지 확인
    • 동시에, Refresh Token 내부의 **exp** 필드를 확인하여 유효한지 검증
    • 유효하면 새로운 액세스 토큰을 발급
    GET user:1:refresh_token  # Refresh Token 확인
    TTL user:1:refresh_token  # 남은 TTL 확인
  3. 토큰 만료 처리

    • Redis에서 Refresh Token이 만료되면 자동 삭제됨
    • TTL이 만료되었거나, **exp** 필드의 시간이 지난 경우 → 새로운 토큰 발급 불가능
    • 사용자는 다시 로그인해야 함
    DEL user:1:refresh_token  # 수동으로 삭제 가능

스프링부트에서 Refresh Token 관리

  • 스프링 부트에서 토큰 만료 기간을 관리할 수 있음
  • Redis에서도 TTL을 설정하면 보안을 더욱 강화할 수 있음
  • 이중 검증(**exp** + TTL)로 더욱 안전한 인증 시스템 구축 가능

Key 삭제

DEL user:email:1  # 특정 Key 삭제
FLUSHDB  # 현재 DB의 모든 Key 삭제

String자료구조-Redis 활용 사례

1. 좋아요 기능 구현 (동시성 해결 포함)

SET likes:posting:1 0  # 포스팅 1번의 좋아요 초기값 설정
INCR likes:posting:1   # 좋아요 증가
DECR likes:posting:1   # 좋아요 감소
GET likes:posting:1    # 좋아요 개수 확인

동시성 이슈 해결

문제: 같은 사용자가 동시에 좋아요 버튼을 클릭하면 데이터 충돌 발생 가능
해결: Redis의 INCR 명령어는 원자적(Atomic) 연산을 제공하여 동시 요청에도 안전하게 처리 가능

예제

  • 카페에서 줄을 서서 주문하는 것처럼, 한 명씩 차례로 요청을 처리
  • 여러 사람이 동시에 좋아요를 눌러도 충돌 없이 정확한 개수 증가

2. 재고 처리 (동시성 문제 해결)

DECR stock:item:1  # 상품 재고 감소
  • 한 명이 상품을 구매하면 동시적으로 다른 사람이 같은 상품을 구매하지 못하도록 제어

3. 캐싱 처리 (JSON 데이터 저장)

SET posting:1 "{\"title\": \"study redis\", \"contents\":  \"redis is ..\",  \"author_email\": \"user@gmail.com\"}" EX 100
  • 조회 성능을 높이기 위해 RDB에서 가져온 데이터를 Redis에 캐싱
  • 데이터가 많아질 경우 TTL(만료 시간) 설정 필수

Redis는 인메모리 DB 🔥

  • 인메모리(In-Memory): 데이터를 디스크가 아닌 RAM(메모리)에 저장하여 빠른 속도를 제공하는 방식
  • 속도는 빠르지만 영구 저장이 어려움 → 주기적으로 디스크에 저장하여 데이터 보호

예제

  • 우리가 인터넷 브라우저에서 자주 방문하는 웹사이트가 브라우저 캐시에 저장되어 빠르게 로딩되는 것과 같은 원리!

스프링 부트에서 Redis 사용 (라이브러리 소개)

Spring Boot에서 Redis 연동을 위해 사용할 수 있는 라이브러리

  • Spring Data Redis: Redis 연동을 쉽게 지원하는 공식 라이브러리
  • Lettuce: 비동기/논블로킹 Redis 클라이언트 (Spring Boot 기본)
  • Jedis: 블로킹 방식의 Redis 클라이언트 (옛날 방식)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Redis 설정 예시 (application.yml)

spring:
  redis:
    host: localhost
    port: 6379
profile
어떤 개발자가 되고싶나

0개의 댓글