본문 바로가기

Spring

[Spring]Redis 연결 (RedisTemplate)

  • 프로젝트 진행 중 캐시 서버 구현을 위해 Redis를 사용해야하는 상황이 발생했다.

Redis란?

  • RDBMS와는 다른 Key-Value형태로 이루어진 비관계적, 비정형적 데이터 관리 시스템.
  • 레디스 내부에서 명령어를 처리하는 부분은 싱글 스레드 아키텍처로 구현
  • Redis를 사용하면 사용자가 다양한 데이터 유형에 매핑되는 키를 저장할 수 있다.
    • 기본적인 데이터 유형은 String으로서, 텍스트 또는 이진 데이터가 이에 해당하며 최대 크기는 512MB.
    • 아래와 같은 것들을 지원한다.
    1. Redis는 문자열이 추가된 순서대로 유지되는 Lists of Strings, Sets of unordered Strings
    2. 점수에 따라 정렬되는 Sorted Sets, 필드와 값 목록을 저장하는 Hashes
    3. 데이터 세트에서 고유한 항목을 세는 HyperLogLogs
  • 인 메모리 데이터 구조를 가진다.
    • 레디스는 메모리에 데이터를 저장하므로 빠른 속도 처리가 장점
    • 데이터를 디스크 또는 SSD에 저장하는 대부분의 데이터베이스 관리 시스템과는 달리 모든 Redis 데이터는 서버의 주 메모리에 상주한다.
    • 거의 모든 유형의 데이터가 Redis를 사용하여 인 메모리에 저장될 수 있다.

Build.Gradle 파일 의존성 추가

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

Redis Config 파일 작성

  • Redis 서버에 접속하기 위한 ConnectionFactory 설정
    • RedisStandaloneConfiguration를 통한 기본 설정(호스트, 포트번호 , 데이터베이스 인덱스)
    • 하나의 Redis 서버는 총 16개의 독립적인 데이터베이스를 지원한다(0 ~ 15번)
    @Bean
    	public RedisConnectionFactory responseRedisConnectionFactory() {
    		RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
    		redisStandaloneConfiguration.setHostName("redisHost");
    		redisStandaloneConfiguration.setPort(6379);
    		redisStandaloneConfiguration.setDatabase(0);
    
    		return new LettuceConnectionFactory(redisStandaloneConfiguration); // 여러 다른 Redis 연결 방법이 있을 수 있습니다.
    	}
    
  • ConnectionFactory를 통한 Redis를 사용하기 위한 RedisTemplate 등록
    • setKeySerializer, setValueSerializer를 통해서 String 형태로 Redis 값을 직렬화한다.
    • 위의 설정을 하지 않을 시 redis-cli 명령어를 통해 값을 확인하면 \xac\xed\x00\x05t\x00\x0와 같은 형태로 저장되어보이게 된다.
    • 이제 필요한 서비스에서 해당 RedisTemplate를 주입하여 사용한다
@Bean(name = "redisTemplate")
	public RedisTemplate<String, String> responseRedisTemplate() {
		RedisTemplate<String, String> template = new RedisTemplate<>();
		template.setConnectionFactory(responseRedisConnectionFactory());
		template.setKeySerializer(new StringRedisSerializer());
		template.setValueSerializer(new StringRedisSerializer());
		return template;
	}