Golang 인 메모리 캐시 cache2go 라이브러리 알아보기
오늘은 Golang으로 타임아웃을 지원하는 인 메모리 캐시 cache2go 라이브러리를 알아보려 합니다.
cache2go 설치
우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.
맥에서 brew로 쉽게 설치할 수 있습니다.
brew install go
우분투에서도 apt로 쉽게 설치할 수 있습니다.
sudo apt-get install golang-go
go get으로 cache2go 패키지를 설치합니다.
go get github.com/muesli/cache2go
홈의 go 폴더에 cache2go 소스코드와 패키지 파일이 생성됩니다.
예제
package main
해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언합니다.
import (
"fmt"
"time"
"github.com/muesli/cache2go"
)
fmt와 time, 그리고 cache2go를 가져옵니다.
type customStruct struct {
text string
extra []byte
}
구조체를 만들어서 임의의 구조의 값을 캐시로 저장할 수 있습니다.
func main() {
cache := cache2go.Cache("cacheTable")
캐시 테이블을 생성합니다.
val := customStruct{"text", []byte{'a'}}
cache.Add("TestKey", 2*time.Second, &val)
임의로 만든 구조체로 값을 채운뒤에 키와 값을 캐시에 추가합니다.
이 때에 캐시에 남아있을 유효 시간을 설정할 수 있습니다.
// cache.Add("TestKey", 0, &val)
만약 무한으로 두고 싶으면 0으로 설정할 수 있습니다.
res, err := cache.Value("TestKey")
if err == nil {
text := res.Data().(*customStruct).text
extra := res.Data().(*customStruct).extra
fmt.Println(text, extra)
} else {
panic(err)
}
키를 이용하여 캐시 테이블에서 값을 가져옵니다.
time.Sleep(3 * time.Second)
시간을 지연시켜서 캐시의 유효 시간을 지나게 합니다.
res, err = cache.Value("TestKey")
if err != nil {
fmt.Println("not cached.")
}
다시 키로 값을 가져올 때에 캐시에 저장된 값이 없음을 알 수 있습니다.
cache.Add("TestKey", 0, &val)
테스트를 위해 다시 키와 값을 만듭니다.
cache.SetAboutToDeleteItemCallback(func(e *cache2go.CacheItem) {
key := e.Key()
TextData := e.Data().(*customStruct).text
ExtraData := e.Data().(*customStruct).extra
created := e.CreatedOn()
accessed := e.AccessedOn()
fmt.Println(key, TextData, ExtraData, created, accessed)
})
콜백에 의해 캐시에서 아이탬이 지워질 때마다 어떤 값이 지워졌는지 알 수 있습니다.
cache.Delete("TestKey")
키로 삭제하면 위 콜백이 수행됩니다.
cache.Flush()
}
캐시 테이블을 초기화 합니다.
Written on August 19, 2019