spring boot 에서 redis 에 데이터 set, get 하는 방법은 크게 아래 2가지가 있습니다.
1) RedisTemplate 를 이용하는 방법 ( low level API )
2) CrudRepository 를 이용하는 방법 ( high level API, JPA 처럼 사용 ) https://www.baeldung.com/spring-data-redis-tutorial
그리고 Redis 구동모드로 아래 3가지가 있으며 각 모드에 따라 connection 설정하는 방법이 약간씩 다릅니다.
standalone
sentinel
cluster
Java의 Redis Client는 크게 2가지가 있습니다.
Spring Boot의 버전이 업그레이드되면서 자연스럽게 Jedis가 deprecated 되는 증상이 발생하였습니다. 잘은 모르겠지만 Lettuce를 쓰자.
두개 다 살펴보자. 일단 공통으로 설정은
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
or(gradle)
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
메인 어플리케이션 클래스에 @EnableCaching 을 선언해주세요.
해당 어노테이션을 선언하면 스프링 부트에서는 @Cacheable과 같은 캐싱 어노테이션의 사용을 인식하게 됩니다.
@EnableCaching
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
spring:
cache:
type: redis
redis:
host: 127.0.0.1
port: 6397
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 5
RedisTemplate의 Serialize, Deserialize로 String을 사용하는 StringRedisTemplate을 사용
Redis는 여러 자료 구조를 가지고 있습니다. 이런 여러 종류의 자료구조를 대응하기 위해 Spring Data Redis
는 opsFor[X](ex. opsForValue, opsForSet, opsForZSet 등)라는 메서드를 제공합니다. 해당 메서드를 사용하면 각 자료구조에 대해서 쉽게 Serialize 및 Deserialize 할 수 있습니다. 각 메서드에 대한 설명은 아래와 같습니다.
@Configuration
public class RedisConfig { //bean 등록
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("localhost",6397);
}
//yml 설정에서 이미 해줬고, 자동 Bean 등록이 안 되는 듯?
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate() {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory());
return stringRedisTemplate;
}
}
https://github.com/stella6767/SpringBootRedis/tree/dev1 깃 주소 dev1 branch
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// string type 저장시 아래 설정 적용됨.
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
// repository 에서 저장시 hash type으로 저장되므로, 아래 설정 적용됨.
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new StringRedisSerializer());
return template;
}
오브젝트도 저장할 수 있도록 설정해주었다.
@Data
public class User implements Serializable {
private String id;
private String pw;
}
위처럼 하는 대신에 설정에서 수정한 거임. 나머지는 1번 방법과 동일
쓰는 거 거의 JPA 랑 똑같다.
public interface PersonRepository extends CrudRepository<Person, Integer> {
//RedisRepository
}
@AllArgsConstructor
@Data
@RedisHash("person") // 이 값이 redis key의 prefix 로 사용됨. ex) key = person:<id> 조합
public class Person {
public enum Gender {
MALE, FEMALE
}
@Id
private Integer id;
private String name;
private Integer age;
private Gender gender;
private Address address;
}
@AllArgsConstructor
@Data
public class Address {
private String name;
}
@Test
public void personSaveTest() {
// given
Address address = new Address("서울특별시 서울시청");
Person person = new Person(null, "kangmingyu", 28, Person.Gender.MALE, address);
// when
Person personEntity = personRepository.save(person);
// then
Optional<Person> findPerson = personRepository.findById(personEntity.getId());
assertThat(findPerson.isPresent()).isEqualTo(Boolean.TRUE);
assertThat(findPerson.get().getAge()).isEqualTo(person.getAge());
}
value까지 같이 확인하는 redis-cli 명령어는 없는 거 같다..
이후 추가로 서비스와 controller 만들어서 실 테스트 결과.
https://deveric.tistory.com/98
https://blog.naver.com/semtul79/222235108317
https://sabarada.tistory.com/104?category=856943
https://happyer16.tistory.com/entry/Redis-Spring-Boot에-설정하기-및-개요