Spring_16_Redis

OngTK·2025년 10월 20일

Spring

목록 보기
16/25

Redis 정리


📘 1. Redis 개요

(1) 정의

Redis (REmote DIctionary Server)
메모리 기반으로 데이터를 Key-Value 형태로 저장하는 NoSQL 데이터 저장소


(2) 목적

  • 관계형 DB(MySQL, Oracle 등)는 디스크 기반 저장소로 속도가 느릴 수 있음
  • Redis는 RAM(주기억장치) 에 데이터를 저장하여 훨씬 빠르게 처리
  • 주로 캐시(Cache) 또는 세션(Session) 관리에 사용됨
비교 항목관계형 DB (MySQL / Oracle)Redis
데이터 구조테이블(Row/Column)Key-Value
저장 위치디스크(보조기억장치)메모리(RAM)
언어 유형SQLNoSQL
사용 목적영구 저장빠른 임시 저장, 캐싱
객체 성격정형 데이터비정형(객체지향적 구조)

(3) 구조

  • Key-Value 기반 (JSON / Map / DTO 구조와 유사)
  • Redis 내부에 저장되는 데이터 예시: student:1 → { "id":"1", "name":"유재석", "age":40, "major":"방송" } student:2 → { "id":"2", "name":"강호동", "age":44, "major":"체육" }

(4) 캐싱의 개념

  • 매번 DB에 접근하여 SELECT 를 수행하면 성능 저하 발생 가능
  • Redis에 자주 조회되는 데이터를 미리 저장(캐싱) 하여
    요청 시 DB 접근 없이 빠르게 반환

📗 2. Redis 설치

(1) Spring 내장형 Redis → 사용하지 않음

(2) 설치형 Redis (로컬 or 서버 설치)

  • Windows 버전 다운로드:
    👉 Redis for Windows Releases
  • 추천 버전:
    • Redis-8.2.2-Windows-x64-msys2-with-Service.zip → 서비스 등록형 (백그라운드 실행)
    • Redis-8.2.2-Windows-x64-msys2.zip → 단독 실행형 (강의용)
  • 압축 해제 후 redis-server.exe 실행
    • 종료 시 서버 OFF → 휘발성(인메모리) → 저장된 데이터 모두 소멸
    • 기본 포트: 6379

(3) Spring Boot 연동 설정

[1] build.gradle

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

[2] application.properties

# [6] Redis 서버 연동 spring.data.redis.host=localhost spring.data.redis.port=6379


📙 3. RedisTemplate 설정 (RedisConfig.java)

@Configuration 
public class RedisConfig {      
  @Bean     
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    // [1.1] RedisTemplate 객체 생성         
    RedisTemplate<String, Object> template = new RedisTemplate<>();          
    // [1.2] Redis 연결 팩토리 설정         
    template.setConnectionFactory(connectionFactory);          
    // [1.3] Key 직렬화 - 문자열 형태로 저장         
    template.setKeySerializer(new StringRedisSerializer());          
    // [1.4] Value 직렬화 - JSON/DTO 형태로 변환         
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());          
    return template;     
  } 
}

💡 직렬화(Serialization)
자바 객체(DTO)를 Redis 저장 가능 형태(JSON)로 변환하는 과정
Redis에서 조회 시 자동 역직렬화되어 Java 객체로 복원됨


📒 4. RedisTemplate 주요 사용법

(1) 객체 생성

private final StringRedisTemplate stringRedisTemplate; // 문자열 전용 private final 
RedisTemplate<String, Object> redisTemplate; // DTO, JSON 등 범용

RedisTemplate을 사용할 경우, 저장 타입에 맞는 직렬화 설정 필수


(2) 데이터 저장 (SET)

// 단순 저장 
redisTemplate.opsForValue().set("student:1", studentDto);  
// TTL(유효기간) 설정 저장 
redisTemplate.opsForValue().set("student:1", studentDto, Duration.ofSeconds(10));
항목설명
key중복 불가
TTLTime To Live (만료 시간)
예시Duration.ofMinutes(5) → 5분 후 자동 삭제

(3) 데이터 조회 (GET)

// 특정 key 조회 
Object value = redisTemplate.opsForValue().get("student:1");  
// 모든 key 조회 
Set<String> keys = redisTemplate.keys("*");  
// 특정 패턴의 key 조회 
Set<String> keys = redisTemplate.keys("student:*");

Key 네이밍 규칙
도메인:식별자 형태 사용 권장
예: user:101, product:12, session:abcd


(4) 데이터 삭제 (DELETE)

boolean result = redisTemplate.delete("student:1");

여러 Key 삭제도 가능

redisTemplate.delete(redisTemplate.keys("student:*"));

(5) Key 존재 여부 확인

boolean exists = redisTemplate.hasKey("student:1");

📕 5. 예제 컨트롤러 (RedisController.java)

@RestController 
@RequestMapping("/redis") 
@RequiredArgsConstructor public class RedisController {      
  private final RedisTemplate<String, Object> redisTemplate;      
  
  // [1] 데이터 저장     
  @PostMapping("/save")     
  public String saveStudent(@RequestBody StudentDto student) {
    redisTemplate.opsForValue().set("student:" + student.getId(), student);         
    return "[저장 완료] " + student.getName();     
  }      
  
  // [2] 데이터 조회     
  @GetMapping("/{id}")     
  public StudentDto getStudent(@PathVariable String id) {         
    return (StudentDto) redisTemplate.opsForValue().get("student:" + id);     
  }      
  
  // [3] 데이터 삭제     
  @DeleteMapping("/{id}")     
  public String deleteStudent(@PathVariable String id) {         
    redisTemplate.delete("student:" + id);         
    return "[삭제 완료] student:" + id;     
  }      
  
  // [4] 모든 데이터 조회     
  @GetMapping("/all")     
  public Set<String> getAllKeys() {         
    return redisTemplate.keys("student:*");     
  } 
}

📗 6. DTO 예시 (StudentDto.java)

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@Builder 
public class StudentDto implements Serializable {     
  private String id;     
  private String name;     
  private int age;     
  private String major; 
}

Redis에 객체를 저장하려면 반드시 Serializable 구현 필요


📙 7. 실행 예시

기능요청URL요청 예시설명
학생 등록POST/redis/save{ "id":"1","name":"유재석","age":40,"major":"방송" }Redis 저장
학생 조회GET/redis/1Redis 캐시 데이터 조회
전체 키 조회GET/redis/allRedis 내부 key 목록
데이터 삭제DELETE/redis/1특정 데이터 삭제

📘 8. Redis CLI 명령어 요약

명령어설명
SET key value데이터 저장
GET key데이터 조회
DEL key데이터 삭제
KEYS *모든 key 조회
EXPIRE key 초TTL 설정
TTL key남은 TTL 확인
FLUSHALL모든 데이터 삭제

📕 9. 주의사항 및 팁

항목설명
휘발성Redis는 메모리 기반 → 서버 종료 시 데이터 소멸
TTL데이터 만료시간을 지정하여 자동 삭제 가능
성능조회 속도는 매우 빠르지만, 메모리 용량이 한정적
Key 관리명명 규칙(도메인:식별자)을 지켜야 유지보수 용이
캐싱 활용DB 조회 결과를 Redis에 저장 후 재사용

✅ 10. 핵심 요약

항목내용
Redis 정의인메모리 기반 NoSQL Key-Value 저장소
Spring 연동RedisTemplate, StringRedisTemplate
주요 기능캐싱, 세션, 임시 저장
데이터 구조Key-Value, Map, JSON
포트기본 6379
TTL자동 만료 기능 (예: Duration.ofSeconds(10))
삭제 명령redisTemplate.delete() 또는 FLUSHALL
profile
2025.05.~K디지털_풀스택 수업 수강중

0개의 댓글