Redis (REmote DIctionary Server)
메모리 기반으로 데이터를 Key-Value 형태로 저장하는 NoSQL 데이터 저장소
| 비교 항목 | 관계형 DB (MySQL / Oracle) | Redis |
|---|---|---|
| 데이터 구조 | 테이블(Row/Column) | Key-Value |
| 저장 위치 | 디스크(보조기억장치) | 메모리(RAM) |
| 언어 유형 | SQL | NoSQL |
| 사용 목적 | 영구 저장 | 빠른 임시 저장, 캐싱 |
| 객체 성격 | 정형 데이터 | 비정형(객체지향적 구조) |
student:1 → { "id":"1", "name":"유재석", "age":40, "major":"방송" } student:2 → { "id":"2", "name":"강호동", "age":44, "major":"체육" }SELECT 를 수행하면 성능 저하 발생 가능Redis-8.2.2-Windows-x64-msys2-with-Service.zip → 서비스 등록형 (백그라운드 실행)Redis-8.2.2-Windows-x64-msys2.zip → 단독 실행형 (강의용)redis-server.exe 실행6379implementation 'org.springframework.boot:spring-boot-starter-data-redis'
# [6] Redis 서버 연동 spring.data.redis.host=localhost spring.data.redis.port=6379
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 객체로 복원됨
private final StringRedisTemplate stringRedisTemplate; // 문자열 전용 private final
RedisTemplate<String, Object> redisTemplate; // DTO, JSON 등 범용
RedisTemplate을 사용할 경우, 저장 타입에 맞는 직렬화 설정 필수
// 단순 저장
redisTemplate.opsForValue().set("student:1", studentDto);
// TTL(유효기간) 설정 저장
redisTemplate.opsForValue().set("student:1", studentDto, Duration.ofSeconds(10));
| 항목 | 설명 |
|---|---|
key | 중복 불가 |
TTL | Time To Live (만료 시간) |
| 예시 | Duration.ofMinutes(5) → 5분 후 자동 삭제 |
// 특정 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
boolean result = redisTemplate.delete("student:1");
여러 Key 삭제도 가능
redisTemplate.delete(redisTemplate.keys("student:*"));
boolean exists = redisTemplate.hasKey("student:1");
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:*");
}
}
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 구현 필요
| 기능 | 요청 | URL | 요청 예시 | 설명 |
|---|---|---|---|---|
| 학생 등록 | POST | /redis/save | { "id":"1","name":"유재석","age":40,"major":"방송" } | Redis 저장 |
| 학생 조회 | GET | /redis/1 | Redis 캐시 데이터 조회 | |
| 전체 키 조회 | GET | /redis/all | Redis 내부 key 목록 | |
| 데이터 삭제 | DELETE | /redis/1 | 특정 데이터 삭제 |
| 명령어 | 설명 |
|---|---|
SET key value | 데이터 저장 |
GET key | 데이터 조회 |
DEL key | 데이터 삭제 |
KEYS * | 모든 key 조회 |
EXPIRE key 초 | TTL 설정 |
TTL key | 남은 TTL 확인 |
FLUSHALL | 모든 데이터 삭제 |
| 항목 | 설명 |
|---|---|
| 휘발성 | Redis는 메모리 기반 → 서버 종료 시 데이터 소멸 |
| TTL | 데이터 만료시간을 지정하여 자동 삭제 가능 |
| 성능 | 조회 속도는 매우 빠르지만, 메모리 용량이 한정적 |
| Key 관리 | 명명 규칙(도메인:식별자)을 지켜야 유지보수 용이 |
| 캐싱 활용 | DB 조회 결과를 Redis에 저장 후 재사용 |
| 항목 | 내용 |
|---|---|
| Redis 정의 | 인메모리 기반 NoSQL Key-Value 저장소 |
| Spring 연동 | RedisTemplate, StringRedisTemplate |
| 주요 기능 | 캐싱, 세션, 임시 저장 |
| 데이터 구조 | Key-Value, Map, JSON |
| 포트 | 기본 6379 |
| TTL | 자동 만료 기능 (예: Duration.ofSeconds(10)) |
| 삭제 명령 | redisTemplate.delete() 또는 FLUSHALL |