본문 바로가기
개발/SPRINGBOOT

REDIS 주의할점.

by tsuyuoto 2024. 10. 6.
반응형
 
 

Spring Redis를 사용할 때 기본적인 CRUD를 알고 있다면, 몇 가지 주의해야 할 항목들이 있습니다. Redis는 메모리 기반 데이터 저장소이므로 몇 가지 특성과 성능 문제를 고려해야 합니다.

1. 데이터 만료 (TTL) 설정

  • Redis는 메모리 기반이기 때문에 저장 공간이 한정되어 있습니다. 만료 시간을 설정하지 않으면 메모리 용량이 점점 차서 서버가 느려지거나 문제가 발생할 수 있습니다.
  • 주의: 모든 데이터에 대해 필요하다면 만료 시간(TTL)을 설정하는 습관을 들이세요. 만료 시간을 설정하지 않으면 메모리 관리가 어려워질 수 있습니다.
redisTemplate.expire("key", 10, TimeUnit.MINUTES); // 10분 후 만료​

2. 메모리 관리

  • Redis는 모든 데이터를 메모리에 저장하므로 대용량 데이터를 다룰 때는 메모리 사용량을 관리하는 것이 중요합니다. 대량의 데이터를 한 번에 저장하거나 불필요하게 큰 데이터를 저장하면 메모리가 금방 소진될 수 있습니다.
  • 주의: 메모리 설정(maxmemory)을 설정하고 적절한 메모리 정책을 사용하세요. Redis는 메모리가 가득 차면 기본적으로 LRU (Least Recently Used) 정책에 따라 오래된 데이터를 삭제합니다.

3. 동시성 문제

  • Redis는 단일 스레드로 동작하지만, 여러 클라이언트가 동시에 접근하면 예상치 못한 동시성 문제가 발생할 수 있습니다. 특히 INCR 같은 연산을 할 때 주의가 필요합니다.
  • 주의: Redis의 원자적 연산이나 Lua 스크립트를 활용해 동시성 문제를 방지할 수 있습니다.
redisTemplate.opsForValue().increment("key", 1); // 원자적 증가 연산​

4. 데이터 일관성

  • Redis는 NoSQL 데이터베이스로, RDBMS와 같은 강력한 일관성 보장을 제공하지 않습니다. Redis는 기본적으로 eventual consistency(최종 일관성)을 따릅니다.
  • 주의: Redis는 강력한 일관성이 필요한 시나리오에는 적합하지 않을 수 있습니다. 데이터 일관성이 매우 중요한 경우, Redis의 pub/sub 기능이나 트랜잭션(멀티 키 연산 시 트랜잭션이 부분적으로 지원)을 사용할 수 있습니다.

5. 분산 환경

  • 단일 Redis 인스턴스가 아닌 클러스터나 레플리케이션을 사용할 때는 데이터의 분산 및 복제 지연을 고려해야 합니다.
  • 주의: Redis Cluster를 사용할 경우 데이터가 여러 노드에 분산되어 저장되므로, 샤딩 키를 잘 설계하고 클러스터 상태를 잘 모니터링해야 합니다. 또한, 레플리케이션에서는 마스터-슬레이브 간 데이터 동기화 지연이 있을 수 있으므로 읽기/쓰기 전략을 신중하게 설계하세요.

6. 직렬화/역직렬화 문제

  • Redis에 객체를 저장할 때는 직렬화/역직렬화 과정을 거칩니다. 이 과정에서 성능 저하나 호환성 문제가 발생할 수 있습니다.
  • 주의: Spring Redis에서는 기본적으로 JDK 직렬화를 사용하지만, 성능을 고려해 JSON이나 프로토콜 버퍼 같은 경량 직렬화 방식을 사용하는 것이 좋습니다.
 
RedisSerializer<String> serializer = new StringRedisSerializer(); 
redisTemplate.setKeySerializer(serializer); 
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // JSON 직렬화

7. Redis 클라이언트 선택

  • Spring에서 Redis를 사용할 때 기본적으로 Jedis와 Lettuce 두 가지 클라이언트를 사용할 수 있습니다.
  • 주의: Lettuce는 비동기 및 스레드 세이프 클라이언트로, 단일 연결에서 여러 스레드를 사용할 수 있어 현대적인 시스템에서 더 적합합니다. 반면 Jedis는 스레드 안전하지 않으므로 여러 스레드 환경에서는 Lettuce를 추천합니다.

8. 캐시 일관성

  • Redis를 캐시로 사용할 때 캐시 일관성 문제가 발생할 수 있습니다. 특히 데이터베이스와 캐시를 모두 사용하는 경우, 캐시와 실제 데이터 간에 불일치가 생길 수 있습니다.
  • 주의: 캐시 일관성 보장을 위해 Cache Aside 패턴을 사용하는 것이 일반적입니다. 캐시 갱신과 무효화 전략을 적절히 설계하세요.

9. Redis 서버 다운 시 복구 방법

  • Redis는 메모리 기반이기 때문에 서버가 다운되면 메모리에 있던 데이터가 사라집니다. 이를 방지하려면 지속성 옵션을 사용해야 합니다 (RDB나 AOF).
  • 주의: 중요한 데이터를 저장할 경우, Redis의 데이터 영속성 옵션을 잘 설정하여 복구 가능성을 높이세요. OF(Append-Only File)를 사용하면 데이터 복구를 위한 로그 파일을 저장할 수 있습니다. 
 
# redis.conf 파일에서 AOF 활성화 
appendonly yes

이러한 항목들을 고려하면 Spring Redis를 보다 안전하고 효율적으로 사용할 수 있습니다.

 

반응형

'개발 > SPRINGBOOT' 카테고리의 다른 글

ApiResponse 형태  (0) 2024.12.16