11.20 TIL - Redis 기본 사용법

이서준·2025년 11월 20일

TIL

목록 보기
4/24

Redis

개요 및 특징

  • Key - Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 인메모리 비관계형 데이터베이스
  • In-memory(메모리) 기반이기 때문에 빠른 읽기/쓰기 속도를 제공
  • 데이터베이스, 캐시, 메시지 브로커 등으로 폭넓게 사용
  • 기본적으로 Key와 Value 구조이므로 복잡한 SQL 쿼리가 필요 없고, 다양한 자료구조를 지원

자료 구조 간단 정리

  • String : 가장 기본적인 Key-Value 구조
  • List : 순서를 가지는 컬렉션
  • Set : 중복을 허용하지 않는 값의 집합
  • Sorted Set (ZSet) : Set과 유사하지만 각 요소에 score가 붙어 정렬된 상태로 관리
  • Hash : 키 내부에 필드- 값 쌍을 담을 수 있는 구조로 연관 배열(맵) 역할을 함

redis.conf 설정 파일 주요 옵션

bind: Redis가 바인딩할 네트워크 인터페이스를 설정

port : 클라이언트, 레플리카간 통신 포트 설정

protected-mode : 외부 접속 보호모드 여부

requirepass : 인증 비밀번호 설정

daemonize : 데몬(백그라운드) 실행 여부

timeout : 클라이언트 유휴 시간 초과 설정

databases : 사용할 데이터베이스 개수 설정

maxmemory : Redis 서버가 사용할 최대 메모리 용량 제한 설정

주의 사항

  • 메모리 사용량이 많기 때문에 메모리 관리 중요( maxmemory 설정)
  • 백업 및 영속화 전략 필요 (RDB, AOF 설정)
  • 인증 / 보안 설정 필수
  • 방화벽 설정 등 네트워크 보안 주의

Redis 설치 - Docker 사용

docker run -d -p 6379:6379 
--name redis 
-v /app/redis/redis.conf:/usr/local/etc/redis/redis.conf
-v /app/redis/data:/data 
redis 
redis-server /usr/local/etc/redis/redis.conf
  • -v /app/redis/redis.conf:/usr/local/etc/redis/redis.conf : 제 로컬에 있는 redis.conf를 컨테이너의 /usr/local/etc/redis 디렉터리 안에 redis.conf를 복사
  • -v /app/redis/data:/data : 내 로컬 /app/redis/data과 컨테이너 /data 와 연결 (데이터를 여기에 저장)
  • redis-server /usr/local/etc/redis/redis.conf : 위의 redis.conf를 기반으로 redis-server 실행

Spring Boot 적용해보기

yaml

spring:
  data:
    redis:
      host: localhost
      port: 6379
      database: 0
      password: tjwns@@
      timeout: 300
  • host : ip 주소 (로컬이면 localhost)
  • port : Redis Port
  • database : 사용할 DB 인덱스
  • password : redis.conf에서 설정한 requirepass (protected-mode 가 yes일 때 사용 가능)
  • timeout : 커넥션 타임아웃

Config

@Configuration
public class RedisConfig {

    /**
     * 키는 String, 값은 Object를 다루는 redisTemplate 설정
     * @param connectionFactory Lettuce 클라이언트
     * @return redisTemplate
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        //값을 JSON으로 직렬화/역직렬화할 Jackson 기반의 직렬자 생성
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);

        //이것을 설정한다고 함
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(serializer);

        //redisTemplate 설정 완료 - 초기화 (직렬화 설정 후 해야할 것)
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 키와 값 모두 String을 다루는 redisTemplate 설정
     * @param connectionFactory
     * @return
     */
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}

Service

@Slf4j
@Service
@RequiredArgsConstructor
public class TestService {

    private final RedisTemplate<String, Object> redisTemplate;

    private String buildKey(Long id) {
        String USER_KEY_PREFIX = "user:";
        return USER_KEY_PREFIX + id;
    }


    public UserDto save(CreateUserRequest createUserRequest) {

        //1. 자동 증가 ID
        Long id = redisTemplate.opsForValue().increment("user:id:sequence");

        User user = new User(id, createUserRequest.getUsername(), createUserRequest.getEmail());

        //2. Redis Hash 저장
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("id", user.getId());
        userMap.put("name", user.getUsername());
        userMap.put("age", user.getEmail());

        redisTemplate.opsForHash().putAll(buildKey(id), userMap);

        return UserDto.from(user);
    }
}

RedisTemplate 주요 메소드

메소드 명반환 오퍼레이션Redis 자료구조
opsForValue()ValueOperaionsString
opsForList()ListOperationsList
opsForSet()SetOperationsSet
opsFoeZSet()ZSetOperationsSorted Set
opsForHash()HashOperationsHash

테스트 사진

keys *

user:id:sequence

user:

profile
Allons-y

0개의 댓글