func main() { debug.SetGCPercent(10) fmt.Println("Number of entries: ", entries) config := bigcache.Config{ Shards: 256, LifeWindow: 100 * time.Minute, MaxEntriesInWindow: entries, MaxEntrySize: 200, Verbose: true, } bigcache, _ := bigcache.NewBigCache(config) for i := 0; i < entries; i++ { key, val := generateKeyValue(i, valueSize) bigcache.Set(key, val) } firstKey, _ := generateKeyValue(1, valueSize) checkFirstElement(bigcache.Get(firstKey)) fmt.Println("GC pause for bigcache: ", gcPause()) bigcache = nil gcPause() //------------------------------------------ freeCache := freecache.NewCache(entries * 200) //allocate entries * 200 bytes for i := 0; i < entries; i++ { key, val := generateKeyValue(i, valueSize) if err := freeCache.Set([]byte(key), val, 0); err != nil { fmt.Println("Error in set: ", err.Error()) } } firstKey, _ = generateKeyValue(1, valueSize) checkFirstElement(freeCache.Get([]byte(firstKey))) if freeCache.OverwriteCount() != 0 { fmt.Println("Overwritten: ", freeCache.OverwriteCount()) } fmt.Println("GC pause for freecache: ", gcPause()) freeCache = nil gcPause() //------------------------------------------ mapCache := make(map[string][]byte) for i := 0; i < entries; i++ { key, val := generateKeyValue(i, valueSize) mapCache[key] = val } fmt.Println("GC pause for map: ", gcPause()) }
func initBigCache(entriesInWindow int) *bigcache.BigCache { cache, _ := bigcache.NewBigCache(bigcache.Config{ Shards: 256, LifeWindow: 10 * time.Minute, MaxEntriesInWindow: entriesInWindow, MaxEntrySize: maxEntrySize, Verbose: true, }) return cache }
func NewCacheHandler(handler http.Handler, cacheConfig CacheConfig) *CacheHandler { bcConfig := bigcache.DefaultConfig(time.Hour) bcConfig.HardMaxCacheSize = cacheConfig.MaxCacheSize // use to calculate initial size bcConfig.MaxEntrySize = 256 // bytes, should fit almost all responses bcConfig.LifeWindow = 2000 // number of unique users seen in time.Hour cache, err := bigcache.NewBigCache(bcConfig) if err != nil { log.WithFields(log.Fields{ "err": err.Error(), }).Panic("Could not create Cache bigcache") } return &CacheHandler{ handler: handler, cache: cache, } }