일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Spring
- 2019 KAKAO BLIND RECRUITMENT
- 브루트포스
- 트라이
- 2020 카카오 인턴십
- 비트마스킹
- BFS
- 백트래킹
- 우선순위큐
- 2018 KAKAO BLIND RECRUITMENT
- 로봇 청소기
- 최소 신장 트리
- 이분탐색
- SWEA
- GIT
- 투 포인터
- 2020 KAKAO BLIND RECRUITMENT
- 백준
- 프로그래머스
- 다익스트라
- 플로이드와샬
- 플로이드 와샬
- 구현
- 스택
- 크루스칼
- 투포인터
- 파이썬
- 시뮬레이션
- 조합
- 2021 KAKAO BLIND RECRUITMENT
- Today
- Total
개발조아
Spring boot Redis 사용하기 본문
- Redis는 In-memory 데이터베이스로 key-value 구조로 자료를 저장하는 비정형 데이터베이스이다.
- In-memory 데이터베이스로 굉장히 속도가 빠르다
- 기본적인 개념자료
https://zangzangs.tistory.com/72
의존성 추가
나는 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를 사용 해야겠다.
'Spring' 카테고리의 다른 글
spring entity uuid 사용시 타입 변경 (0) | 2021.10.07 |
---|---|
Spring URL에서 데이터 가져오기 (0) | 2021.10.07 |
Entity, Repository, Service 관련 어노테이션 및 주의점 (0) | 2021.09.01 |