Yac
Yac (Yet Another Cache)
Yac는 "Yet Another Cache"의 약자로, 잠금(lock)이 필요 없는 공유 메모리 사용자 데이터 캐시예요. 이 페이지에서는 Yac가 무엇이고 어떻게 동작하는지 개요를 살펴봐요.
출처: Yac
본문
Yac는 잠금 없는(lock-free) 공유 메모리 사용자 데이터 캐시로, APC나 로컬 memcached를 대체할 수 있습니다.
Yac는 데이터를 공유 메모리에 저장해요. 그래서 같은 머신의 모든 PHP 워커(worker)가 어떤 프로세스 간 통신(inter-process communication)도 없이 데이터를 볼 수 있습니다. 잠금을 쓰는 대신, Yac는 **원자적 슬롯 갱신(atomic slot update)과 몇 번의 충돌 탐색(collision probe)**에 의존합니다. 따라서 캐시 미스(cache miss)가 요청을 절대 블록하지 않고, 동시 쓰기는 기껏해야 실패한 저장(failed store)이나 놓친 읽기(missed read)를 유발할 뿐인데, 이는 호출자가 그냥 재시도하면 됩니다.
접근 경로에 잠금도 프로세스 간 통신도 없기 때문에, **읽기는 본질적으로 공유 메모리에서의 해시 조회(hash lookup)**입니다. 그 결과 Yac는 매우 빨라요. 마이크로초 수준의 읽기 지연시간을 가지며, 쓰기가 키들에 걸쳐 분산되어 있으면 처리량이 워커 수에 따라 확장될 수 있습니다(벤치마크 참고).
Yac는 정확성 보장을 속도·처리량과 맞바꾸는 대신, 만들기엔 비싸지만 다시 만들기는 쉬운 데이터에 가장 잘 맞아요. 페이지 조각(page fragment), 설정 스냅샷(configuration snapshot), 작은 서비스 응답, 기타 로컬 캐시 같은 것들이죠. 대체 불가능한 데이터의 권위 있는 저장소로는 쓰면 안 됩니다.
yac 2.4.0부터는 작은 스칼라 값들 — NULL, 불리언, 대부분의 정수(64비트 빌드에서 60 부호 비트에 들어가는), 7바이트 이하의 문자열, 빈 배열 — 이 별도의 값 블록 대신 해시 슬롯 안에 직접 저장됩니다("임베디드 값", embedded values). 이렇게 되면 접근할 때마다 값 메모리 할당과 블록 복사를 없애 성능이 크게 개선되고 메모리 사용량도 줄어요. 2.4.0은 압축 백엔드도 FastLZ에서 LZ4로 전환해서, 압축된 읽기가 몇 배 빨라졌습니다.
참고: 공유 메모리는 한 머신 안에서만 보입니다. 여러 서버에 걸쳐 캐시를 공유하려면 Memcached나 Redis 같은 네트워크 캐시를 사용해야 해요.
Yac가 제공하는 클래스와 메서드는 다음과 같아요.
- Yac 클래스 —
Yac::__construct,Yac::add,Yac::delete,Yac::dump,Yac::flush,Yac::get,Yac::__get,Yac::info,Yac::set,Yac::__set