🌱 → 🌳

Spring에서 Redis로 캐싱처리 본문

Server/Java & Spring

Spring에서 Redis로 캐싱처리

BAY 2023. 5. 16. 01:02
728x90
  • UT를 통해 데이터 베이스에 요청이 가장 많이 들어오는 Service에 데이터를 빠르게 조회할 수 있도록 Server side caching을 적용하여 성능을 향상 시켰습니다.
  • @Cacheable을 사용해서 서비스에서 가장 조회가 많이 생기는 공고 조회 로직을 Redis를 이용하여 캐싱처리
// 레디스 캐시
    @Bean
    public RedisCacheManager redisCacheManager() {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
                .defaultCacheConfig()
                .disableCachingNullValues()
                .serializeValuesWith(
                        RedisSerializationContext.SerializationPair
                                .fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper))
                );

        return RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory())
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
// domain.study.service.StudySearchService

// 캐시 키 생성
    public String generateCacheKey(String keyword, int pageIndex, int pageCount, String sortedType, UserDetailsImpl userDetails, CompanyDetailsImpl companyDetails) {
        String userId = userDetails != null ? String.valueOf(userDetails.getUser().getId()) : "null";
        String companyId = companyDetails != null ? String.valueOf(companyDetails.getCompany().getId()) : "null";

        return "CustomKey [" + keyword + "," + pageIndex + "," + pageCount + "," + sortedType + "," + userId + "," + companyId + "]";
    }

 

캐싱 적용 전 

 

캐싱 적용 후 

 

RedisTemplate (low level)

RedisTemplate은 Redis와 상호작용하도록 높은 수준으로 추상화를 제공하는 클래스로 다양한 Redis 연산, 예외 변환, 트랜잭션, 직렬화 커스텀 기능을 제공한다.

  • Redis 트랜잭션 기능: Redis는 싱글 쓰레드, Atomic한 자료구조로 RaceCondition을 피할 수 있다. Redis 트랜잭션 기능 좀 더 큰 단위로 그러한 Atomic한 여러 명령어들을 한 묶음으로 묶어주는 기능이다. MULTI → commands → EXEC/DISCARD

 

Redis Config

 ConnectionFactory는 lettuce로 설정한 다음 RedisTemplate 빈을 등록해준다.

 

Serializer

  • JdkSerializationRedisSerializer: 디폴트로 등록되어있는 Serializer이다.
  • StringRedisSerializer: String 값을 정상적으로 읽어서 저장한다. 그러나 엔티티나 VO같은 타입은 cast 할 수 없다.
  • Jackson2JsonRedisSerializer(classType.class): classType 값을 json 형태로 저장한다. 특정 클래스(classType)에게만 직속되어있다는 단점이 있다.
  • GenericJackson2JsonRedisSerializer: 모든 classType을 json 형태로 저장할 수 있는 범용적인 Jackson2JsonRedisSerializer이다. 캐싱에 클래스 타입도 저장된다는 단점이 있지만 RedisTemplate을 이용해 다양한 타입 객체를 캐싱할 때 사용하기에 좋다

 

 

728x90