Redis Cache..
728x90

build.gradle에 dependency 추가

//redis
  implementation 'org.springframework.boot:spring-boot-starter-data-redis'

application.properties

#Redis set
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.cache.type=redis

따로 캐시 기능을 사용할 것이므로 캐시 타입을 redis로 설정

Config 클래스 생성

config 패키지를 생성해서 config 클래스 생성
여기서 만든 config 클래스는 총 2개

RedisConfig.java

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    public final ObjectMapper objectMapper;

    public RedisConfig(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){ //Redis Server 통신

        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){ //Redis Connection

        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();

        redisStandaloneConfiguration.setHostName(host);

        redisStandaloneConfiguration.setPort(port);

        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }
}

 

Redis의 설정등을 빈등록을 한다.

CacheConfig.java

@Configuration
public class CacheConfig {

    private final RedisConnectionFactory redisConnectionFactory;

    private final ObjectMapper objectMapper;

    public CacheConfig(RedisConnectionFactory redisConnectionFactory, ObjectMapper objectMapper) {
        this.redisConnectionFactory = redisConnectionFactory;
        this.objectMapper = objectMapper;
    }

    @Bean
    public CacheManager redisCacheManger(){ //Bean 등록으로 인해 default인 로컬에 캐시를 저장하지 않고 redis에 저장함
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .entryTtl(Duration.ofSeconds(600)); //cache 유효시간 10분

        RedisCacheManager redisCacheManager = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration).build();

        return redisCacheManager;
    }

}

 

@EnableCaching 추가

@SpringBootApplication
@EnableCaching
public class JpaTest2Application {

    public static void main(String[] args) {
        SpringApplication.run(JpaTest2Application.class, args);
    }

}

 

    @Transactional(readOnly = true)
    @Cacheable(key = "#params", value = "boardDetail")
    @GetMapping("/board-detail")
    public Map<String,BoardVO> boardDetail(@RequestParam Map<String,String>params){

        Long bno = Long.parseLong(params.get("bno"));

        Map<String,BoardVO> list = new HashMap<>();

        list.put("list",boardService.findByBno(bno));

        return list;
    }

value(=cacheNames) 캐시의 이름, key 는 redis의 key값

redis에서 캐시 조회시 사용할 명령어에

get value::key

이렇게 검색하면 된다.

 

캐시 삭제

간단하다. 캐시를 삭제할 메소드 위에다가 @CacheEvict(value = "캐시이름", allEntries = true)라고 하면된다.

allEntries = true로 열어주면, 해당 key의 접두사로 시작하는 모든 key를 제거해준다. 만약 특정 캐시를 삭제하고 싶으면

allEntries가 아니라 key값을 넣어서 동일한 캐시를 삭제해 주면 된다.

 

*주의점
allEntries는 실제 프로젝트에서는 사용을 권장하지 않는다. 그 이유는 여기에서 확인하면 된다.
https://dev-racoon.tistory.com/36 

728x90

'캐싱 > Redis' 카테고리의 다른 글

Redis란  (0) 2022.06.05
Redis(2) - Docker에 Redis 설치하기  (0) 2022.01.12