GitHub - go-redis/cache: Cache library with Redis backend for Golang (original) (raw)

Redis cache library for Golang

Build Status GoDoc

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 usesMessagePack to marshal values.

Optionally, you can use TinyLFU or any othercache algorithm as a local in-process cache.

If you are interested in monitoring cache hit rate, see the guide forMonitoring using OpenTelemetry Metrics.

Installation

go-redis/cache supports 2 last Go versions and requires a Go version withmodules support. So make sure to initialize a Go module:

go mod init github.com/my/repo

And then install go-redis/cache/v9 (note v9 in the import; omitting it is a popular mistake):

go get github.com/go-redis/cache/v9

Quickstart

package cache_test

import ( "context" "fmt" "time"

"github.com/redis/go-redis/v9"
"github.com/go-redis/cache/v9"

)

type Object struct { Str string Num int }

func Example_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,
}

if err := mycache.Set(&cache.Item{
    Ctx:   ctx,
    Key:   key,
    Value: obj,
    TTL:   time.Hour,
}); err != nil {
    panic(err)
}

var wanted Object
if err := mycache.Get(ctx, key, &wanted); err == nil {
    fmt.Println(wanted)
}

// Output: {mystring 42}

}

func Example_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, // destination
    Do: func(*cache.Item) (interface{}, error) {
        return &Object{
            Str: "mystring",
            Num: 42,
        }, nil
    },
})
if err != nil {
    panic(err)
}
fmt.Println(obj)
// Output: &{mystring 42}

}