출처: https://qiita.com/ktykogm/items/cdaf03ffd137934d142a
eko/gocache
Built-in stores
이 가운데 Local cache 하고 확인을 bigcache 및 ristretto에서 실시하고 싶다고 생각합니다.
gocache 주의 사항
Bigcache 대해
Bigcache는 gigabyte 정도의 크기에 고속으로 대응하는 cache이다.
성능을 내기 위해 병행 처리하로 예를 들면 sync.RWMutex는 쓰기가 차단 되기 때문에 이렇게 이용하는 것은 피하고 샤드를 이용하여 적절히 분산시켜 고루틴의 블록을 피할 수 있는 궁리를 하고 있다.
샤드의 수가 비교적 많고, 해시 함수가 고유 키에 적절히 분산된 수를 반환하면 lock 경합은 거의 제로로 최소화 할 수 있다는 것으로 이것이 샤드를 사용하기로 한 이유이다.
또한 오래된 캐시 삭제는 FIFO로 타임 스탬프를 비교하여 쉽게 할 수 있도록 하여 캐시 엔트리에 대해서 gc를 하지 않도록 latency를 줄인 것 같다.
https://awesomeopensource.com/project/allegro/bigcache
https://allegro.tech/2016/03/writing-fast-cache-service-in-go.html
https://github.com/allegro/bigcache
Ristretto 에 대해
Ristretto 는 아래와 같은 특징을 가지고 있다.
성능과 정확성에 중점을 두고 있고,
Dgraph(수평 스케일이 가능한 오픈 소스 그래프 데이터베이스. GraphQL 같은 Query를 가지고 Protocol Buffers over GRPC and HTTP 지원) 충돌 없는 캐시가 필요해서 개발 되었다.
https://github.com/dgraph-io/benchmarks/tree/master/cachebench/ristretto
https://blog.dgraph.io/post/introducing-ristretto-high-perf-go-cache/
높은 적중률 같다.
여기에 실려 있는 벤치 마크 결과를 보면, 매우 적중률이 높은 처리량도 좋은 것 같다.
https://github.com/dgraph-io/ristretto#search
캐시 성능 측정 용 repository
https://github.com/k-oguma/go-cache-benchmarks
아래의 라이브러리를 벤치 마크
key: "a", value: "b" 라는 글자의 Cache Set와 Get, Delete 측정을 한다
장문 value의 Cache Set와 Ge, Delete 측정을 한다
측정 결과
ns/op = 처리 1회 당에 걸린 nsec
B/op = 1회 당 할당된 메모리 양 (Byte)
allocs/op = 1회당 당 메모리 할당 횟수