Redis, Cache 는 왜 사용하는걸까?
백앤드 개발을 하다보면 가끔 조회하는 시간 때문에 API 응답이 너무 느릴 때가 있다. 이럴 때 캐시를 사용하면 응답시간이 많이 줄어든 경험이 있을 것이다. ( 인메모리에 올려서 한 경우도 있지만?... ) 그렇다고 무조건 캐시를 사용하면 될까? 남용하게 되면 서비스의 신뢰성이 떨어지는 경우가 발생할 수도 있다.
Cache 도입할때 고려사항 - 1. 정보가 잘 변경되지 않는 경우 + 처리 시간이 긴 경우
이를 고려하지 않고 도입을 한다면 데이터가 맞지 않아 서비스의 신뢰성이 떨이지게 된다
Cache 도입할때 고려사항 - 2. 빈번한 동일 요청
빈번하게 동일한 검색 요청을 하게 된다면 Cache 도입을 고려해볼 수 있다. 디스크에서 읽어오는 것 보다 서버의 메모리에서 읽어오면 훨씬 빠른 I/O 성능을 얻을 수 있다.
이 두가지를 고려했을 때 타당하다면 Cache 도입을 통해 사용자에게 쾌적한 서비스를 제공해주는게 좋다고 생각한다.
그렇다면 어떤 정보들을 보통 Cache로 사용할까?
- 쇼핑물에서 베스트셀러, 추천상품 등
- 상품의 카테고리 및 카테고리별 등록 상품 수
- 포탈의 검색어
Cache를 도입하기러 결정했다면, 주의해야 할 점은?
- 캐싱할 정보를 선택하기
- 캐싱할 정보의 유효기간 설정하기 ( Time To Live )
- 캐싱할 정보의 갱신시점
백앤드 설계를 할 때 API기능 설계 단계에서부터 캐싱 전략을 세우는게 좋다.
Redis + Spring boot
1. gradle에 추가
// redis
compile('org.springframework.boot:spring-boot-starter-data-redis')
2. application.yml에 Redis 연결정보 설정하기
# prod config
spring:
redis:
host: redis 주소
port: 6379
prefix:
3. 해당 프로젝트에 캐시 사용하겠다는 어노테이션 추가
@SpringBootApplication
@EnableCaching
public class CacheApplication
4. 캐시 등록, 조회, 삭제 중 원하는 기능 추가
@Cacheable(value = "goodsCardsByAreaId", keyGenerator = "customKeyGenerator", cacheManager = "cacheManager10Minute")
public List<GoodCardDTO> makeGoodsCardsByAreaId(String sort, Integer areaId, Integer saleType,
5. Redis Cache 설정 커스터마이징 하기
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport
{
@Bean
@Override
public CacheManager cacheManager() {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory());
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
.prefixKeysWith("imhere:")
.entryTtl(Duration.ofHours(5L));
builder.cacheDefaults(configuration);
return builder.build();
}
}
조회 성능을 향상시키기 위한 방법 중 하나인 Redis와 관련해서 글을 써보았다. 항상 시스템 성능 향상을 위해 공부해 나가야겠다.
https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#cache
'Back-End > Redis' 카테고리의 다른 글
레디스와 분산락 (0) | 2020.07.19 |
---|---|
Redis란? (0) | 2020.03.17 |
레디스(Redis)의 다양한 활용 사례 (4) | 2020.03.17 |