티스토리 뷰
지난 번에 Jmeter를 이용해서 순간적으로 많은 트래픽을 보냈다.
그 결과 데이터베이스 조회건수가 늘어나고 자원도 많이 소모된다.
그런데 같은 정보를 계속 조회한다면?
굉장히 비효율적일 것이라고 생각이된다.
현재 MySQL 데이터 베이스를 쓰고 있는데
외부저장장치에 저장되어 있는 데이터를 읽어서 연산을 하는데
HDD, SSD에 접근해서 읽어오는 것보다
RAM에 접근해서 캐시되어있는 데이터를 읽어오는 것이
병목현상이나 속도면에서도 장점이 있을것으로 예상이 된다.
Cache 란?
- 데이터나 값을 미리 복사하여 저장해두는 임시 저장소입니다.
- 캐시를 사용하면 자주 사용되는 데이터나 값을 더 빠르게 액세스할 수 있습니다.
- 일반적으로 캐시는 빠른 액세스 속도를 제공하기 위해 메모리에 저장됩니다.
- 매번 데이터를 계산하거나 디스크에서 읽어와야 하는 작업을 수행할 때, 이 작업을 캐시에 저장하면 다음에 같은 작업을 수행할 때 더 빠르게 액세스할 수 있습니다.
- 캐시를 사용하면 시스템의 부하를 감소시킬 수 있습니다.
- 캐시된 데이터는 메모리에 저장되기 때문에, 디스크나 네트워크 등에 액세스할 필요가 없어 시스템 부하를 줄일 수 있습니다.
Redis 란? (Remote Dictionary Server)
- Redis는 오픈 소스 기반의 인메모리 데이터 저장소이며, 다양한 데이터 구조를 지원하는 NoSQL 데이터베이스입니다. Redis는 key-value 형태로 데이터를 저장하며, 기본적으로 메모리에 데이터를 저장하고 디스크에도 데이터를 저장할 수 있다.
- Redis는 데이터를 메모리에 저장하기 때문에 매우 빠른 데이터 액세스 속도를 제공한다. 디스크에서 데이터를 읽어오는 것보다 수백 배 이상 빠르다.
위에 설명과 같이 대용량 트래픽에 대응하려면 캐시데이터를 이용하는것이
프로젝트 성능 향상에 도움이 된다고 생각된다.
이제 로컬환경에서 설치를 해보고 사용해보자
나는 도커를 사용해서 쉽게 설치해서 사용할 것이다.
도커 설치
https://www.docker.com/products/docker-desktop/
Download Docker Desktop | Docker
Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!
www.docker.com
터미널에서 Redis 이미지 다운로드하고 실행
# docker pull redis
# docker run --name myredis -d -p 6379:6379 redis
# docker run -it --link myredis:redis --rm redis redis-cli -h redis -p 6379
도커에서 Redis-cli 환경으로 진입하기
- 도커에 모든 컨테이너가 종료되어 있을경우 시작을해야한다.
시작할 컨테이너가 있는지 확인
# docker ps -al
컨테이너 실행
# docker start myredis
Redis cli접속
# dicker exec -it myredis redis-cli
밑에 있는 블로그를 참고해서 테스트를 해보겠습니다.
https://kim-oriental.tistory.com/28
[JAVA Spring Boot] Rest API + 레디스 캐시 (Redis Cache) 적용 및 샘플 예제
안녕하세요, 이번엔 Spring Boot Rest API 서비스를 만들고, Redis를 이용하여 API 캐시(cache)를 적용해보는 샘플을 만들어 보도록 하겠습니다. API 캐시란 우선 캐시(Cache)란, 한번 처리한 데이터를 임시로
kim-oriental.tistory.com
RedisConfig
@EnableCaching
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@SuppressWarnings("deprecation")
@Bean
public CacheManager cacheManager() {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory());
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer 변경
.prefixKeysWith("Test:") // Key Prefix로 "Test:"를 앞에 붙여 저장
.entryTtl(Duration.ofMinutes(30)); // 캐시 수명 30분
builder.cacheDefaults(configuration);
return builder.build();
}
}
Controller
@RestController
public class TestController {
@Autowired
TestService svc;
@Cacheable(value = "TestVo", key = "#id")
@GetMapping("/getTest")
public TestVo getData(@RequestParam String id ){
return svc.getTestSvc(id);
}
Service
@Service
public class TestService {
public TestVo getTestSvc(String id){
TestVo tvo = new TestVo();
tvo.setId(id);
tvo.setText( id + "님, 안녕하세요~!");
System.out.println("[id:" + id + "] Service 에서 연산을 수행합니다");
return tvo;
}
}
Vo
@Data // Lombok 미적용 시, Getter/Setter 메서드 추가
public class TestVo {
private String id;
private String text;
}
application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
테스트
다음은 실제 프로젝트에 적용해보도록 하겠습니다.
'Redis' 카테고리의 다른 글
Redis 장애 상태일때 DB조회 하도록 수정하기 (0) | 2023.04.20 |
---|---|
동시성 문제(Redisson 라이브러리) (0) | 2023.04.19 |
프로젝트 Redis 캐시 적용하기 (0) | 2023.04.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- java
- Load Balancer
- 로드 밸런서
- 로드밸런서
- CodeDeploy
- CICD
- aws
- 위치의 중요성
- 시작 템플릿
- 오토 스케일링
- 인스턴스
- githubactions
- script
- Auto Scaling
- HTML
- EC2
- flask
- JWT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함