
이번에는 Spring과 Redis를 연결하고 Spring Cache설정을 Redis로 변경해서 사용해 봅시다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'
StringRedisTemplate Class를 사용하기 위해 starter-data-redis 를 추가합니다.
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
// 일반적인 key:value의 경우 시리얼라이저
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
// Hash를 사용할 경우 시리얼라이저
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
// 모든 경우
redisTemplate.setDefaultSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
LettuceConnectionFactory 생성자를 만들 때, ip and port 번호를 적게되는데 현재는 local환경으로 따로 redis 설정을 변경하지 않았다면은 파라미터 없어도 괜찮습니다.
@GetMapping("/set")
public String setValue(@RequestParam String key, @RequestParam String value) {
redisService.setStringValue(key, value, 3600);
return "저장 성공: " + key;
}
@GetMapping("/get")
public String getValue(@RequestParam String key) {
return "값: " + redisService.getStringValue(key);
}
테스트가 목적이라 @Get으로 만들었습니다.
//저장
public void setStringValue(String key, String value, long timeoutSeconds) {
redisTemplate.opsForValue().set(key, value, Duration.ofSeconds(timeoutSeconds));
}
//조회
public String getStringValue(String key) {
return redisTemplate.opsForValue().get(key);
}


위에서 설정을 추가하면 됩니다.
implementation 'org.springframework.boot:spring-boot-starter-cache'
runtimeOnly 'com.h2database:h2'
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues();
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration)
.build();
}
}
spring:
cache:
type: redis
기존 redis만 바라보고 있었더라면, 이번에는 메인 DB가 H2로 설정하고 Cache를 redis로 설정했습니다.
cache를 우선적으로 확인하고 해당 정보가 없다면 DB를 조회하게 됩니다.
private final RedisStringRepository redisStringRepository;
// 캐시 조회 (캐시에 없으면 메서드 실행 후 저장)
@Cacheable(value = "redis-cache", key = "#key")
public String getValue(String key) {
log.info("key : {} ", key);
RedisString redisString = redisStringRepository.findById(key).orElse(RedisString.builder().build());
return redisString.getRedisKey() + " : " + redisString.getRedisValue(); // 실제로는 DB 조회 등의 로직이 들어갈 수 있음
}
// 캐시에 값 업데이트
@Transactional
@CachePut(value = "redis-cache", key = "#key")
public String updateValue(String key, String value) {
log.info("key : {} ", key);
RedisString redisString = RedisString.builder().redisKey(key).redisValue(value).build();
redisStringRepository.save(redisString);
return value;
}


cache를 통해 저장된 key인 경우 앞에 prefix로 redis-cache::가 붙은걸 확인할 수 있습니다.

@CachePut 을 사용하기에 Cache에 값이 있던 없던 메소드를 실행하기에 DB에서도 값을 확인할 수 있습니다.

DB에 Insert를 직접하고 web에서 조회할 경우 해당 값은 cache hit가 되지 않음으로 DB를 조회 후 해당 값을 redis로 저장하는 모습도 볼 수 있습니다.