3.2.4 공식문서
https://docs.spring.io/spring-data/redis/reference/
0. Depdency
//Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
1. Configuration
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.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());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
host는 로컬 환경이라면 localhost,
port는 default로 6379이다.
LettuceConnectionFactory 생성자 과정에서 host와 port를 넘겨주어서 ConnectionFactory를 만든다.
RedisTemplate을 이용할 경우, Key와 Value에 따라 Serializer를 설정해주어야 한다.
사용 자료형에 따라 넣어주면 되겠다.
2. Entity
Redis entity는 @RedishHash로 쉽게 구현할 수 있다.
엔티티 내에는 반드시 org.springframework.data.annotation.Id 가 포함되어야 한다.
이 Id가 Redis 내에서 Id값으로 사용된다.
@RedisHash("people")
public class Person {
@Id
String id;
String firstname;
String lastname;
Address address;
}
3. TTL
TTL(TimeToLive)은 Redis에 담긴 오브젝트가 유효한 시간을 뜻한다.
짧은 시간동안만 살아있는게 유리한 object들에게는 유리하다.
@RedisHash("people", timeToLive = 30000L)
public class Person {
@Id
String id;
String firstname;
String lastname;
Address address;
}
위와 같이 @RedishHash에 TTL을 전달해도 되고,
public class TimeToLiveOnProperty {
@Id
private String id;
@TimeToLive
private Long expiration;
}
public class TimeToLiveOnMethod {
@Id
private String id;
@TimeToLive
public long getTimeToLive() {
return new Random().nextLong();
}
}
위와 같이 활용할 수도 있겠다.
@TimeToLive는 한 클래스 내에 하나만 존재해야 하며, 필드값으로도 존재할 수 있다.
4. Redis Repository
기본적으로 Redis의 Repository 사용을 위해선 CrudRepository를 사용한다.
public interface PersonRepository extends CrudRepository<Person, String> {
}
다른 Repository와 동일하게 기본적인 CRUD 동작들을 제공한다.
@Autowired PersonRepository repo;
public void basicCrudOperations() {
Person rand = new Person("rand", "al'thor");
rand.setAddress(new Address("emond's field", "andor"));
repo.save(rand);
repo.findOne(rand.getId());
repo.count();
repo.delete(rand);
}
쿼리 메소드들은 다음을 참고하자.
https://docs.spring.io/spring-data/redis/reference/repositories/query-keywords-reference.html
5. RedisTemplate
RedisTemplate은 앞의 Configuration에서 보았듯이 Java기반 직렬화와 역직렬화가 사용된다.
기본적으로 새로운 value를 간단하게 넣는 방법은 ValueOperations를 이용한다.
public interface ValueOperations<K, V> {
void set(K key, V value);
void set(K key, V value, long timeout, TimeUnit unit);
void set(K key, V value, Duration timeout);
@Nullable
Boolean setIfAbsent(K key, V value);
@Nullable
Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit);
@Nullable
default Boolean setIfAbsent(K key, V value, Duration timeout);
@Nullable
Boolean setIfPresent(K key, V value);
@Nullable
Boolean setIfPresent(K key, V value, long timeout, TimeUnit unit);
@Nullable
default Boolean setIfPresent(K key, V value, Duration timeout);
void multiSet(Map<? extends K, ? extends V> map);
@Nullable
Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map);
키를 지정하는 방법은 여러가지가 있다. 여러 타입으로 timeout을 직접 지정할 수도 있고, Map을 직접 지정해서 전달하는 방법도 있다.
public class Test {
private final RedisTemplate<String, Object> redisTemplate;
public void save(String key, Object val) {
redisTemplate.opsForValue().set(key, val);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public boolean delete(String key) {
return Boolean.TRUE.equals(redisTemplate.delete(key));
}
public boolean hasKey(String key) {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}
}
RedisTemplate은 기본적으로 Serializer와 Deserializer를 설정할 수 있다는 장점이 있고, Repository와 달리 Redis의 모든 데이터 유형을 제공한다.
제어와 유연성에 유리한 RedisTemplate과 사용성이 쉬운 Repository중 상황에 따라 사용하면 되겠다.
'BackEnd > Spring Boot' 카테고리의 다른 글
[Spring] REST API 카카오 로그인 구현하기 (5) | 2024.05.20 |
---|---|
[Spring] CORS 개념과 Spring Security 6 설정 톺아보기 (0) | 2024.05.19 |
[Kafka] JUnit5 Kafka 단위 메세지 발행, 성능 테스트 (0) | 2024.04.03 |
[Spring] 분산 시스템에서 효과적인 데이터 전달 방법 (3) - Kafka (0) | 2023.11.11 |
[Spring] 분산 시스템에서 효과적인 데이터 전달 방법 (2) - RabbitMQ (0) | 2023.11.10 |