1 Oct 2020

Spring boot에서 Redis 사용하는 방법과 Redis개념

Redis개념


Redis란?

redis는 고성능 key-value저장소로서 String,List,hash,set,sorted set등 여러 형식의 자료구조를 지원하는 NoSQL이다.

메모리에 상주하면서 RDBMS의 캐시 솔루션으로 사용된다.


Redis사용용도

Redis는 Message Queue, Shared Memory, Remote Dictory용도로 사용할 수 있다. RDBMS에서 조회를 했을때

구조상 DISK에서 데이터를 가져오는데 이는 Memory에서 읽는것보다 천배가량 느리다. 이때 Redis같은 인메모리

key-value솔루션을 사용하여 DB의 read연산 부하를 분산시키는것에 가능하다.


영구성

Redis는 메모리에 저장되므로 휘발성이다. 하지만 disk에 저장할 수 있는 기능이 있다. 따라서 Redis는 서버가

다운되도 재시작하고 disk에 저장해놓은 데이터를 다시 읽어들일 수 있어 데이터를 유실시키지 않을 수 있다.


Redis데이터를 Disk에 저장하는 2가지 방법

  • Snapshot

    • 어떤 특정 시점의 데이터를 Disk에 옮겨담는 방식이다.

      • Blocking방식의 save와 Non-blocking방식의 background-save방식이 있다.

  • AOF

    • Redis의 모든 write/update연산 자체를 모두 log파일에 기록하는 형태이다.

    • 서버가 재시작할 경우 write/update를 순차적으로 재실행, 데이터를 복구한다.

Redis공식문서에서 권장사항은 주기적으로 snapshot으로 백업하고 다음 snapshot까지의 저장을 AOF방식을 수행하는 것이다.


Redis 특징

  • 영속성을 지원하는 인메모리 데이터 저장소

  • 읽기 성능 증대를 위한 서버 측 복제를 지원한다.

    • master-slave

      • Redis서버가 다운되는 경우 장애조치 및 높은 읽기성능을 지원하기 위해 슬레이브를 마스터에 연결하고 전체 데이터베이스의 초기 복사본을 받는 master/slave 복제를 지원한다. 마스터에서 쓰기가 수행되면 슬레이브 데이터 세트를 실시간으로 업데이트하기 위해 연결된 모든 슬레이브로 전송된다.

    • Sharding

      • 테이블 파티셔닝 처럼 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법이다.


Spring boot에서 Redis 사용하는 방법

Spring Boot Gradle dependency추가

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


Config

host,port정보는 yml 설정 파일에서 가져옵니다.

@Configuration
@EnableRedisRepositories
@EnableRedisHttpSession
public class RedisConfig {
    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        return new LettuceConnectionFactory(redisHost,redisPort);
    }

    @Bean
    public RedisTemplate<String,Object> redisTemplate(){
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

저장하기

lombok을 사용해서 DI받았습니다.

@RequiredArgsConstructor
@Controller
public class TestController {
    private final RedisTemplate<String,Object> redisTemplate;

    //test.html 페이지에 접속하는 순간 레디스에 RedisMemberDto객체를 저장합니다.
    @GetMapping("/test")
    public String index(){
        ValueOperations<String,Object> valueOperations=redisTemplate.opsForValue();
        RedisMemberDto redisMemberDto=new RedisMemberDto();
        redisMemberDto.setAge(10);
        redisMemberDto.setName("홍길동");
        valueOperations.set("key",redisMemberDto);

        return "test";
    }

    //레디스에서 값을 바로 가져와 리턴합니다.
    @GetMapping("/test/student")
    @ResponseBody
    public RedisMemberDto findStudent(){
        ValueOperations<String,Object> valueOperations=redisTemplate.opsForValue();
        return (RedisMemberDto)valueOperations.get("key");
    }
}


결과

redis결과


Tags:
0 comments