goburrow / cache

Mango Cache 🥭 - Partial implementation of Guava Cache in Go (golang).
BSD 3-Clause "New" or "Revised" License
574 stars 48 forks source link
cache golang lru slru tinylfu

Mango Cache

GoDoc Go

Partial implementations of Guava Cache in Go.

Supported cache replacement policies:

The TinyLFU implementation is inspired by Caffeine by Ben Manes and go-tinylfu by Damian Gryski.

Download

go get -u github.com/goburrow/cache

Example

package main

import (
    "fmt"
    "math/rand"
    "time"

    "github.com/goburrow/cache"
)

func main() {
    load := func(k cache.Key) (cache.Value, error) {
        time.Sleep(100 * time.Millisecond) // Slow task
        return fmt.Sprintf("%d", k), nil
    }
    // Create a loading cache
    c := cache.NewLoadingCache(load,
        cache.WithMaximumSize(100),                 // Limit number of entries in the cache.
        cache.WithExpireAfterAccess(1*time.Minute), // Expire entries after 1 minute since last accessed.
        cache.WithRefreshAfterWrite(2*time.Minute), // Expire entries after 2 minutes since last created.
    )

    getTicker := time.Tick(100 * time.Millisecond)
    reportTicker := time.Tick(5 * time.Second)
    for {
        select {
        case <-getTicker:
            _, _ = c.Get(rand.Intn(200))
        case <-reportTicker:
            st := cache.Stats{}
            c.Stats(&st)
            fmt.Printf("%+v\n", st)
        }
    }
}

Performance

See traces and benchmark

report