공부한 영상 👍
자료 구조 차이
- string: memcheched, redis
- collections: redis
- CAS: memcheched
- replication: redis
- cluster: redis
- ACL: redis
collections -> 개발의 난이도가 달라짐
- memcached는 key-value만 지원한다
- key에 여러 값을 저장하고 싶은데 동시에 트렌젝션이 돌면 race condition이 생김
- 이런 문제를 해결하기 위해 CAS(Compare And Swap) 제공
- Redis는 그냥 Hash나 Set에 저장하면 된다
메모리 관리 정책
memcached
- slab algorithm
- 메모리 pool과 비슷
- slab 단위로 메모리를 잘라놓음
- 요청 단위의 slab에서 가져감
- linked list처럼 되어 있다
- 다 쓰고 돌려놓음
- key + item 합쳐서 구성
- key + item 사이즈가 1MB를 넘지 못한다
redis
- malloc에 전적으로 맡김
- Jemalloc의 성능이 좋은 편
- 메모리 할당이 빠르지 않고 비균일하다
- key, item 따로 할당한다
동기화 측면
- 많은 트래픽을 잘 처리하기 위해서 서버의 리소스를 잘 사용해야 하고, 여러 코어를 잘 이용하기 위해서 Multi-Thread의 사용이 필요
- Lock을 어떻게 하느냐
redis
- redis는 기본적으로 Single Threaded이다
- 기본적으로 Lock이 필요 없다
- 그런데 왜이리 빠를까
- 빠른 자료구조 사용 (HashTable O(1))
- 기본적으로 Atomic하다
- Multi Thread를 쓰기는 한다
- 데이터 Write는 Main Thread에서만 처리 (동기화 필요 없음)
- 네트워크 패킷을 읽고 전송하는 부분에서만 사용
memcached
- Multi Thread로 동작
- Lock striping 이용
- key를 해싱하고 -> 비트마스크해서 lock을 건다
- CAS(Compare And Swap)
- CAS: AJFXL TMFPEMDPTJ Locking 없이 Atomic을 보장하기 위한 방법
- 이전 값과 현재 값이 동일하면 업데이트 한다
- memcached는 CAS의 컨셉을 가져왔다