토비의 봄 티비 스페셜 캐시 - 강대명님
2023, Mar 18
강의 주소
https://www.youtube.com/live/zkbvFOwJFgA?feature=share
Summary
db에 붙어서 풀스캔한다고 하면, db자체의 캐시를 통해 호출한다해도 느려질 수 밖에 없다.
db가 느려지면, web/was 모두 느려지게 되기 때문에
이럴 때 캐시를 적용하면 연산자체를 빠르게 할 수 있다.
언제 캐시를 쓰는가?
- 데이터가 자주 변경되는가
- 연산이 얼마나 비싼가
- 서비스 신뢰도가 영향이 있을 수 있다.
read보단 write할때 캐시를 써도 되나 안되나 고민필요
- 쓰기를 위한 캐시
- write back
- disk가 젤 느리고, 메모리가 그보단 빠르긴 하지만 일단 둘다 io가 발생하고 io는 한계치가 있는데 엄청나게 쓰게 되면 디스크가 나갈 수도 있고, 디스크가 한계가 있어서 메모리에 담아뒀다가 디스크로 싱크를 하게 되는데,
- 전원이 커지면 메모리에 저장되었던 데이터가 날라가므로, replication에 대한 설계가 필요하다.
- write back
- disk보다 네트워크가 빠른가?
- 어떤 회선을 사용하는가에 따라 다르고
- disk는 일정시점 전달하다 실패해버리면, 데이터 유실이 발생할 수 있다. 하지만 네트워크는 다중화 구성을 통해 예방할 수 있긴하다
- 하지만 100% 데이터를 유실없이 빠르게 하는 것은 없기 때문에, 어떤게 비용이 저렴하고 커버가 가능한가를 봐서 결정해야한다. 즉, 데이터 유실해도 상관없다거나
- 어플리케이션에 저장하는 로컬 캐시 = 메모리에 저장하는 것
- ehcache같은 라이브러리를 쓰거나, 변수에 저장하거나
- 없어졌을 경우 대책 필요하고, 동기화를 어떻게 할지 정책 필요
- 한쪽이 바뀌면 통보가 필요하다. 이 통보를 완벽히 할 수 있나. 그래서 redis같은 인메모리 디비를 쓰면 빠르게 할 수 있다.
- 동기화를 얼마나 맞춰서 해야하는지
- jpa의 트랜잭션과 캐시를 맞춰서 dirty read가 없어야 한다는 의견도 있고 트랜잭션은 고려안핸다고 의견도 있고
- 인메모리 디비를 쓰는 것
- 요청했을 때의 시점으로 저장되기 때문에 트랜잭션 개념이 없다.
- redis는 ehcache와 다르게 클러스터링이 필요없고 웹서비와 분리되어 관리되기 때문에 외부에 쓰고 읽는 개념으로 보면 된다. 동기화에 대한 부담이 없다.
- db는 디스크를 쓰게되지만 redis는 메모리에 쓰기 때문에 한계치 더 크지만 유실될 수 있다.
- 캐시는 캐시 데이터가 날라가면, 모든 요청에 대한 트래픽이 db에 요청하게 된다.
- 트래픽이 많으면 캐시가 죽으면 db가 죽을 수도 있다.
- thundering cause : 한개의 캐시키를 여러군데에서 참조하고 있는데, 이걸 여러군데에서 한번에 10만개 요청했다고 하면 유실되었을 때 캐시가 없으니 db로 요청이 가서 죽을 수 있다.
- 트위터의 경우 1차 캐시, 2차 캐시, 3차 캐시를 갖고 있어서, 3차까지 없으면 그때 db에서 조회하도록 하고 있다 —> 이건 비싼 비용을 감수하고 한 설계
- 파레토 법칙 현상 발생
- redis vs memcached
- redis를 message queue로 사용하게 될 경우
- list 자료구조로 되어있고
- pub-sub보단 notification으로 호출하게 된다.
- redis 활용예
- 랭킹 구현
- api limiter : 초당 api 몇개만 호출하게 한다든지
- cache vs buffer
Reference
[Cache] Write Through과 Write Back의 차이