본문 바로가기
BackEnd/Spring-boot

[Redis] Spring-boot-data-redis 캐싱

by Chaedie 2023. 7. 9.
728x90

1. 설치


$ docker pull redis
$ docker run --name some-redis -p 6379:6379 -d redis
$ docker exec -it some-redis redis-cli

2. Config

// pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 디펜던시 설정
application.properties

# REDIS
spring.redis.host=localhost
spring.redis.port=6379
  • property 설정, 우선 local에서 돌려볼거라 이정도만 세팅
@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);
    }
}
  • config/RedisConfig.java 에 위 코드처럼 config 생성

3. 간단한 사용

  • 진짜 간단한 찍먹을 위해 알아야할건 RedisTemplate라는게 있고, LocalStorage에 set 하듯 <String, String>으로 세팅할 수 있다.
  • 물론 redisTemplate.opsForValue(); 이외에 set, hash, list 등으로 set할수있지만 찍먹이니까 String, String으로 set하는 opsForValue()로 해본다.
// 이를 위해 위 config 파일에 아래 코드를 추가한다. 
@Bean
public RedisTemplate<?, ?> redisTemplate() {
    RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    return redisTemplate;
}
public Long customerTotalCount(PaginationDTO paginationDTO) {
    ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
    String search = paginationDTO.getSearch();
    Long totalCount = Long.parseLong(Optional.ofNullable(valueOperations.get(search))
            .orElseGet(() -> {
                String countStr = customerDAO.countTotalByCNameContains(paginationDTO).toString();
                valueOperations.set(search, countStr);
                return countStr;
            }));

    return totalCount;
}
  • 그리고 redisTeplate을 사용해서 위와 같이 코드를 짜본다.
  • 위 코드의 요구사항과 결과물은 아래에 나와있습니다.
  • Java를 잘 사용하지 못해 코드가 이상할 수도 있습니다... 아직 어떤 코드가 좋은 코든지 알지 못하는 수준이라서요.. 그래도 결과물은 나와서 좋네요.. 이로써 Spring Boot에서 Redis 연동, 찍먹 성공!

요구사항

Spring boot 프로젝트에서 redis/Lettuce를 config에 성공했다.
원하는 동작은 List Pgae에서 페이지네이션 되는 모든 리스트를 캐싱하고 싶었는데, 내가 가진 지식으로는 너무 어렵더라.
그래서 우선 Data-JPA에서는 제공해주지만 ORACLE 11g라 직접 추가적으로 Count select을 날리고 있던 query라도 캐싱처리로 줄여보고자 했다.

그리고 성공했따. ㅎㅎ

결과물

진짜 별거아닌 카운트 쿼리 하나 없앤건데 ㅋㅋㅋㅋㅋ 왤케 뿌듯하지 ㅋㅋㅋㅋ

일단 Redis 찍먹을 해봤으니 앞으론 어떻게 "잘 사용할지" 고민해보고 적용시켜보자. ㅋㅋ

참고: 참고로 select count(c_name) from customer;로 쿼리를 날렸는데, count()내부에는 굳이 c_name의 값이 필요한게 아니라면 *을 쓰는게 훨씬 빠른 성능을 보인다고 한다.

출처: [MySQL] COUNT의 잘못된 인식과 속도 차이

댓글