캐시 매니징
https://sehuncodingjournal.tistory.com/96
제가 쓴거지만 한번 보고 오면, 이해가 더 쉬워 집니다.
Redis (Cashing 캐싱/성능 높히기)
Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)이다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데
sehuncodingjournal.tistory.com
출처
Spring Cache에 대해 알아보자
애플리케이션을 개발하며 쓰기 동작보다 읽기 동작이 많은 데이터가 있다면 캐시 도입을 고민할 수 있다.
velog.io
[ReSeller Project] Redis, 세션 저장소와 캐시 저장소를 분리해 보자 ❗
Redis, 세션 저장소와 캐시 저장소를 분리해 보자 ❗
velog.io
Redis는 싱글 스레드로 동작하는 만큼(그런대도 멑리 쓰레드 DB 보다 빠르다) 데이터의 atomic(원자성) 함을 보장해 주기 때문에 데이터의 일관성을 보장하며 동시성 문제가 발생하지 않는다는 장점이 있다.
그러나 CPU를 하나 밖에 쓰지 못한다는 단점이 있다. Redis가 메모리에서 운영되기 때문에 CPU에서 생기는 병목현상은 드문 편이지만 어떤 명령어에 대한 작업이 끝나기 전까지 다른 명령어들은 대기해야 한다.
Redis 서버 분리

먼저 위와 같이 application.yml 또는 application.properties에서 사용할 port 번호와 host를 설정하자. 아직 local 개발 중이므로 cache - host를 도커 머신 IP로 지정해 줬다.
public class CacheConfig {
...
// Cache
@Value("${spring.redis.cache.host}")
private String redisHost;
@Value("${spring.redis.cache.port}")
private int redisPort;
@Bean(name = "redisCacheConnectionFactory")
public RedisConnectionFactory redisCacheConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisHost,
redisPort);
return lettuceConnectionFactory;
}
...
// Session
@Value("${spring.redis.session.host}")
private String redisHost;
@Value("${spring.redis.session.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisHost,
redisPort);
return lettuceConnectionFactory;
}
세션 저장소로 사용할 RedisConnectionFactory와 캐시 데이터 저장소로 사용할 RedisConnectionFactory를 분리해 주자.
주의할 점은 RedisConnectionFactory 타입의 Bean이 2개가 존재하기 때문에 반드시 @Qualifier와 @Bean 이름을 명시적으로 지정해서 빈 주입 시 충돌이 일어나지 않도록 하자.
@Autowired : 명시한 타입과 일치하는 빈을 먼저 검색, 동일한 타입의 빈이 여러 개가 존재하는 경우 문제가 발생
@Primary : 동일한 타입의 빈이 여러 개가 존재하는 경우, 해당 어노테이션이 붙은 빈을 우선적으로 주입
@Qualifier : 동일한 타입의 빈이 여러 개가 존재하는 경우, 지정된 조건과 일치하는 빈을 주입
@Resource : @Autowired와 달리 명시한 빈의 아이디와 일치하는 빈을 먼저 검색하여 주입
public class CacheConfig {
//.. 생략
@Bean
public CacheManager redisCacheManager(
@Qualifier("redisCacheConnectionFactory") RedisConnectionFactory redisConnectionFactory) {
RedisCacheManager redisCacheManager = RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(redisCacheDefaultConfiguration())
.withInitialCacheConfigurations(redisCacheConfigurationMap()).build();
return redisCacheManager;
}
}
@Qualifier("redisCacheConnectionFactory") 이와 같이 @Qualifier를 통해 주입할 빈을 명시적으로 처리해야 한다.
docker exec -i -t 이름 redis-cli
마지막으로 위 명령어를 입력해서 redis-cli를 실행해 캐시 데이터가 정상적으로 저장되었는지 확인해 보자.