캐시(Cache)
캐싱은 어디에 적용할 수 있을까?
- 변화가 많지 않은 데이터를 매번 DB에서 데이터를 조회해서 보여주는 것이 비효율적인 경우
- 자주 조회되는 데이터
캐시를 사용하면 얻는 점은?
- 읽기(조회) 성능을 향상할 수 있다.
- RDB의 경우, Disk에 접근해야 하기 때문에 상대적으로 연산 수행이 오래 걸린다. 반면 Redis와 같은 캐시는 메모리에서 동작하기 때문에 상대적으로 빠르게 연산을 수행할 수 있다.
무작정 캐시를 적용하면 좋을까?
- 아무데서나 다 사용한다고 좋은 것은 아니다. 데이터가 업데이트될 때 마다 캐시도 함께 업데이트 해주어야 하기 때문이다. 캐시에 데이터가 과하게 쌓일 경우, side effect가 발생할 수 있다.
Ngrinder 설치 및 환경 설정
설치 : https://github.com/naver/ngrinder/releases
Ngrinder 실행
java -jar ngrinder-controller-3.5.6.war --port=8300
agent Management 실행
./run_agent.bat
Ver.
- ngrinder-controller-3.5.6.war
- ngrinder-agent : 3.5.6
- Springboot 2.7.4
- Java 11
<!-- cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.9.2</version>
</dependency>
localCache(Ehcache) 실습
5000건의 공지사항 전체 데이터 조회를 조회하는 작업
GET /api/notices
캐시 적용 전
- Duration : 1분
- Vuser(가상 사용자) : 10
캐시 적용 후
- TTL 20초로 설정
- Vuser(가상 사용자) : 10
- Duration : 1분
캐시 적용 후 수치 변화
- 평균 TPS : 41.7 → 118.6 약 3개 개선
- Peak TPS : 53.0 → 172.0
- Mean Test Time : 221.09 ms → 74.7 ms 약 3배 단축
- Exected Tests : 2134 → 6268 약 3배 실행
실제 공지사항 페이지를 조회하는 것 처럼 1-10page 랜덤 호출
Cache 적용 전
- Vuser(가상 사용자) : 10
- Duration : 1분
Cache 적용 후
- TTL 20초로 설정
- Vuser(가상 사용자) : 10
- Duration : 1분
- 보통 공지사항 데이터를 최신데이터를 위주로 보는 특성을 고려하여 캐싱처리는 5page 까지만 적용
- 6page ~ 10page는 캐시 미적용
캐시 적용 후 수치 변화
- 평균 TPS : 1595.9 → 1800.1
- Peak TPS : 1980.5 → 2041.5
- Mean Test Time : 5.68 ms → 5.06 ms
- Exected Tests : 86750 → 98000
참고
- https://kk-programming.tistory.com/83
- https://www.inflearn.com/course/%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0-%EC%B4%88%EC%84%9D-%EB%8B%A4%EC%A7%80%EA%B8%B0