cache
CDN-like, middleware memory cache for Go applications with integrated shielding and Go 1.18 Generics.
Usage
package main
import (
"context"
"fmt"
"time"
"github.com/AlexSSD7/cache"
)
type Person struct {
Name string
Age uint32
}
func fetchPerson(name string) (*Person, error) {
switch name {
case "John":
return &Person{Name: "John", Age: 27}, nil
case "Steve":
return &Person{Name: "Steve", Age: 32}, nil
default:
return nil, fmt.Errorf("unknown person with name '%v'", name)
}
}
func main() {
cache := cache.NewShieldedCache[*Person](time.Second * 5)
cacheCtx, cacheCtxCancel := context.WithCancel(context.Background())
defer cacheCtxCancel()
cache.StartWorker(cacheCtx)
ret, hit, err := cache.Fetch("person_john", time.Minute, func() (*Person, error) {
return fetchPerson("John")
})
fmt.Printf("result: %+v, hit: %v, err: %v\n", ret.Data, hit, err)
ret, hit, err = cache.Fetch("person_john", time.Minute, func() (*Person, error) {
return fetchPerson("John")
})
fmt.Printf("result: %+v, hit: %v, err: %v\n", ret.Data, hit, err)
ret, hit, err = cache.Fetch("person_steve", time.Minute, func() (*Person, error) {
return fetchPerson("Steve")
})
fmt.Printf("result: %+v, hit: %v, err: %v\n", ret.Data, hit, err)
ret, hit, err = cache.Fetch("person_alice", time.Minute, func() (*Person, error) {
return fetchPerson("Alice")
})
fmt.Printf("result: %+v, hit: %v, err: %v\n", ret, hit, err)
}
License
MIT