설정부는 후에 Spring Boot 설정으로 다룰 예정

RedisCacheManager
Spring Cache 어노테이션이 실제 동작 할 때
Redis를 사용하도록 연결해주는 라이브러리
공통적인 TTL 만료 시간을 정하거나,
캐시 별 키 별로 TTL을 다르게 설정하거나, 직렬화, 역직렬화
방식을 지정하는 등으로 사용한다
@Configuration
@EnableCaching // @Cacheable 활성화
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
@Primary
public RedisCacheManager redisCacheManager() {
RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(15))
.serializeValuesWith(
RedisSerializationContext.SerializationPair
.fromSerializer(RedisSerializer.json())
);
// 캐시별 TTL 개별 설정
Map<String, RedisCacheConfiguration> configs = new HashMap<>();
//region 상품 관련 캐싱
configs.put("productCache", defaultConfig.entryTtl(Duration.ofMinutes(30)));
configs.put("categoryCache", defaultConfig.entryTtl(Duration.ofHours(1)));
configs.put(PRODUCT_SEARCH, defaultConfig.entryTtl(Duration.ofMinutes(30)));
//endregion
//region 검색어 관련 캐싱
configs.put(SEARCH_RANKING, defaultConfig.entryTtl(Duration.ofMinutes(10)));
//region 이벤트 관련 캐싱
configs.put("eventListCache", defaultConfig.entryTtl(Duration.ofMinutes(5)));
//endregion
return RedisCacheManager.builder(redisConnectionFactory())
.cacheDefaults(defaultConfig)
.withInitialCacheConfigurations(configs)
.build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(RedisSerializer.json());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(RedisSerializer.json());
template.afterPropertiesSet();
return template;
}
}Spring Boot 4.X 기준
작동 흐름
@Cacheable
→ 캐시 저장 시작
→ RedisCahcheManager
→ Redis 저장 호출
→ Redis 저장@Cacheable 이 실제로 어디에 캐시를 저장하게 할지
결정하는 것이 RedisCacheManager
RedisTemplate
Spring이 제공하는 Redis 클라이언트 템플릿
→ Java 코드로 Redis 명령어를 실행하게 해준다
@Configuration
public class RedisTemplateConfig {
@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> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(RedisSerializer.json());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(RedisSerializer.json());
template.afterPropertiesSet();
return template;
}
}Spring Boot 4.X 기준
RedisTemplate 명령어
redisTemplate.opsForValue().set("user:1", "Test");
String name = (String) redisTemplate.opsForValue().get("user:1");
System.out.println(name);
| SET / GET |
|---|---|
| HSET / HGET |
| LPUSH / LRANGE |
| SADD / SMEMBERS |
| ZADD / ZRANGE |
TTL 만료시간 설정 예시
// (key, value, 기간, 단위(초, 분, 시간))
redisTemplate.opsForValue().set("temp:data", "123", 10, TimeUnit.MINUTES);Spring Boot 에서의 활용
// 읽기 시 캐싱
public Post getPost(Long postId) {
String key = PREFIX + postId;
// 캐시 확인
Post cached = (Post) redisTemplate.opsForValue().get(key);
if (cached != null) {
System.out.println("Cache Hit");
return cached;
}
// 없으면 DB에서 조회
Post post = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
// 캐시에 저장
redisTemplate.opsForValue().set(key, post, 10, TimeUnit.MINUTES);
return post;
}
💡
Share article