go-redis/cache is brought to you by ⭐ uptrace/uptrace. Uptrace is an open source and blazingly fast distributed tracing tool powered by OpenTelemetry and ClickHouse. Give it a star as well!
go-redis/cache library implements a cache using Redis as a key/value storage. It uses MessagePack to marshal values.
Optionally, you can use TinyLFU or any other cache algorithm as a local in-process cache.
If you are interested in monitoring cache hit rate, see the guide for Monitoring using OpenTelemetry Metrics.
go-redis/cache supports 2 last Go versions and requires a Go version with modules support. So make sure to initialize a Go module:
go mod init github.com/my/repoAnd then install go-redis/cache/v9 (note v9 in the import; omitting it is a popular mistake):
go get github.com/go-redis/cache/v9package cache_test
import (
"context""fmt""time""github.com/redis/go-redis/v9""github.com/go-redis/cache/v9"
)
typeObjectstruct {
StrstringNumint
}
funcExample_basicUsage() {
ring:=redis.NewRing(&redis.RingOptions{
Addrs: map[string]string{
"server1": ":6379",
"server2": ":6380",
},
})
mycache:=cache.New(&cache.Options{
Redis: ring,
LocalCache: cache.NewTinyLFU(1000, time.Minute),
})
ctx:=context.TODO()
key:="mykey"obj:=&Object{
Str: "mystring",
Num: 42,
}
iferr:=mycache.Set(&cache.Item{
Ctx: ctx,
Key: key,
Value: obj,
TTL: time.Hour,
}); err!=nil {
panic(err)
}
varwantedObjectiferr:=mycache.Get(ctx, key, &wanted); err==nil {
fmt.Println(wanted)
}
// Output: {mystring 42}
}
funcExample_advancedUsage() {
ring:=redis.NewRing(&redis.RingOptions{
Addrs: map[string]string{
"server1": ":6379",
"server2": ":6380",
},
})
mycache:=cache.New(&cache.Options{
Redis: ring,
LocalCache: cache.NewTinyLFU(1000, time.Minute),
})
obj:=new(Object)
err:=mycache.Once(&cache.Item{
Key: "mykey",
Value: obj, // destinationDo: func(*cache.Item) (interface{}, error) {
return&Object{
Str: "mystring",
Num: 42,
}, nil
},
})
iferr!=nil {
panic(err)
}
fmt.Println(obj)
// Output: &{mystring 42}
}