개발조아

Spring boot Redis 사용하기 본문

Spring

Spring boot Redis 사용하기

개발조아 2021. 12. 19. 14:35
728x90
  • Redis는 In-memory 데이터베이스로 key-value 구조로 자료를 저장하는 비정형 데이터베이스이다.
    • In-memory 데이터베이스로 굉장히 속도가 빠르다
  • 기본적인 개념자료

https://zangzangs.tistory.com/72

 

인메모리 데이터 저장소 Redis, 왜 사용할까? #Redis 파헤치기

인메모리 데이터 저장소 Redis 개발을 하다보면 트랜잭션이 많이 발생하는 화면에서 느껴지는 느림(?) 같은 것을 느끼곤 했다. 자주사용되는 하지만 세션에 담고 있기에는 뭔가 모호한 것들을 조

zangzangs.tistory.com


의존성 추가

나는 gradle를 사용하기에 dependencies를 설정했다.

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

 

 


Properties 추가

Spring boot에 Redis properties를 설정한다.

나는 yml을 사용해서 application.yml에 추가 했다.

application.yml

spring:  
  redis:
    host: localhost
    port: 6379

host : redis 서버의 주소

port: redis 서버의 포트 번호

 

 


Redis Configuration

redis 설정을 해주자.

 

자바의 Redis Client 라이브러리는 2개가 있다.

  • Jedis
  • Lettuce

근데 Lettuce가 더 성능이 좋다고 한다. 그래서 Lettuce로 redisConnectionFactory를 통해 Redis와 연결한다.

참고 : https://jojoldu.tistory.com/418

 

Spring boot 2.0부터 RedisTemplate와 StringTemplate를 자동생성 되어서 따로 빈에 등록안해도 된다고 한다.

RedisTemplate에는 serializer를 설정해주는데 설정하지 않는 다면 직접 redis-cli로 데이터 확인이 어렵다.

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

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

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

        //일반적인 key:value의 경우 시리얼라이저
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // Hash를 사용할 경우 시리얼라이저
        //redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        //모든 경우
        //redisTemplate.setDefaultSerializer(new StringRedisSerializer());

        return redisTemplate;
    }

 


Redis 사용하기

사용하는 법은 두가지가 있다.

repository를 사용하는 것과 template를 사용하는 것이다.

 


RedisRepository

repository로 사용하면 Entity를 만들어서 쉽게 사용할 수 있다.

이때는 hash로 데이터가 생성이 된다.

우선 사용하기 위해선 Configuration에 @EnableRedisRepositories 어노테이션을 추가하여 repository를 사용한다고 명시해야한다.

 

Entity

@Getter
@RedisHash(value = "access")
public class AccessToken {

    @Id
    private String id;
    @Indexed
    private String token;
    @TimeToLive
    private int expired;

    public AccessToken(String id, String token, int expired) {
        this.id = id;
        this.token = token;
        this.expired = expired;
    }
}

Entity로 사용하기 위해 @RedisHash 어노테이션을 추가한다.

그리고 이름을 정해준다.

 

@Id : Id가 키 값이 된다.

@Indexed : 값으로 검색을 할 시에 추가한다.

@TimeToLive : 만료시간을 설정

   - RedishHash 어노테이션에 설정해도 된다.

   - 값은 초 단위로 설정된다.

 

 

Repository

public interface AccessTokenRepository extends CrudRepository<AccessToken, String> {
    public Optional<AccessToken> findByToken(String token);
}

CrudRepository만 상속 받아서 Jpa처럼 사용 가능하다.

이때 Indexed를 추가한 속성만 추가적으로 findBy등을 추가할 수 있다.

 

데이터를 저장하게되면 크게 두가지로 나눠서 저장된다.

 

  • entity
  • entity:key값

entity는 Set으로 저장되며 생성된 key 값들이 저장된다.

 

entity:key는 실제 데이터가 hash 데이터로 들어간다.

 

만약 entity에 indexed를 추가 했다면 entity:key:속성값과 entity:key:idx로 키가 더 만들어진다.

이것으로 검색에 사용하는 듯하며, 아직 정확한 용도와 왜 생기는지는 모르겠다.

 

한가지 주의점이 해당 entity에 만료시간을 지정해도 위의 두개의 데이터는 삭제되지 않고 남아있는다.

 


 

RedisTemplate

@Service
public class RedisUtils {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void setData(String key, String value,Long expiredTime){
        redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS);
    }

    public String getData(String key){
        return (String) redisTemplate.opsForValue().get(key);
    }

    public void deleteData(String key){
        redisTemplate.delete(key);
    }
}

 

사용법은 간단하다. 

객체 만들어서 레디스의 자료구조 타입에 맞는 메소드를 사용하면 된다.

 

레디스의 자료구조에 따라 사용하는 메소드가 다르다.

 

메소드 명 레디스 타입
opsForValue String
opsForList List
opsForSet Set
opsForZSet Sorted Set
opsForHash Hash

 

데이터를 저장할 때 만료 시간 지정할 시에는 해당 시간의 단위까지 지정해주면 된다.

나는 밀리초로 설정했다.

 


Repository가 사용하기는 편하고 Entity처럼 사용할 수 있어서 편하다. 하지만 Indexed로 속성을 만들고 하면 만료시간이 지나도 쓰레기값으로 남아있게 되어 결국 나중에는 용량초과가 날듯 하다. 그래서 편한것도 좋지만 Template로 사용하는게 좋아 보인다. Template도 어려운게 아니므로 가급적 Tempalte를 사용 해야겠다.

Comments