Documentation
¶
Index ¶
- Constants
- Variables
- func TypeAssert(source, target interface{}) (err error)
- type Cache
- func (c *Cache) Delete(ctx context.Context, key interface{}, opts ...Option) error
- func (c *Cache) Execute(ctx context.Context, operation string, key, value interface{}, opts ...Option) error
- func (c *Cache) Get(ctx context.Context, key, value interface{}, opts ...Option) error
- func (c *Cache) Item(key, value interface{}, opts ...Option) *Item
- func (c *Cache) Set(ctx context.Context, key, value interface{}, opts ...Option) error
- func (c *Cache) With(opts ...Configure) *Cache
- type Configure
- func WithDataOption(do ...Option) Configure
- func WithDefaultNamespace(ns, separator string) Configure
- func WithDefaultTTL(ttl time.Duration) Configure
- func WithHandleDelete(m ...Handle) Configure
- func WithHandleGet(m ...Handle) Configure
- func WithHandleOperation(op string, m ...Handle) Configure
- func WithHandleSet(m ...Handle) Configure
- func WithMiddleware(mw ...Handle) Configure
- type ErrorTarget
- type Handle
- type Item
- type Key
- type Option
- type Provider
Examples ¶
Constants ¶
const ( OperationGet = "get" OperationSet = "set" OperationDelete = "delete" )
available operation.
Variables ¶
var ( ErrCacheMiss = errors.New("cache miss") ErrCacheExpired = errors.New("cache expired") ErrSourceNotValid = errors.New("source is not valid") ErrKeyNotValid = errors.New("key is not valid") ErrTargetNil = errors.New("target is nil") ErrOperationNotAllwed = errors.New("operation not allowed") )
Cached errors.
Functions ¶
func TypeAssert ¶ added in v0.0.2
func TypeAssert(source, target interface{}) (err error)
TypeAssert assert source to target.
Types ¶
type Cache ¶
type Cache struct {
// contains filtered or unexported fields
}
Cache base cache.
Example (ClearByContext) ¶
package main
import (
"context"
"fmt"
"time"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/mw"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
type ctxKey int
var (
requestID ctxKey = 1
cached, cached2 string
)
ctx, cancel := context.WithCancel(context.WithValue(context.Background(), requestID, "unique ctx key"))
ctx2 := context.WithValue(context.Background(), requestID, "unique ctx key2")
c := cache.New(provider(),
mw.WithClearByContext(requestID),
cache.WithDataOption(cache.WithNamespace("clear_by_ctx", "")),
)
fmt.Printf("err: %v\n", c.Set(ctx, 1, "some ctx loaded data", cache.WithTTL(time.Hour)))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached), cached)
cancel()
time.Sleep(time.Millisecond)
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx2, 1, &cached2), cached2)
}
func provider() cache.Provider {
return memory.NewMap()
}
Output: err: <nil> err: <nil>, value: 'some ctx loaded data' err: cache miss: map, value: ''
Example (ClearByTTL) ¶
package main
import (
"context"
"fmt"
"time"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/mw"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
ctx := context.Background()
c := cache.New(provider(),
mw.WithClearByTTL(),
cache.WithDataOption(cache.WithNamespace("clear_by_ttl", "")),
)
var cached, cached2 string
fmt.Printf("err: %v\n", c.Set(ctx, 1, "some ttl loaded data", cache.WithTTL(time.Microsecond*200)))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached), cached)
time.Sleep(time.Second)
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached2), cached2)
}
func provider() cache.Provider {
return memory.NewMap()
}
Output: err: <nil> err: <nil>, value: 'some ttl loaded data' err: cache miss: map, value: ''
Example (Encoding) ¶
package main
import (
"context"
"fmt"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/memory"
"gitoa.ru/go-4devs/encoding/gob"
)
func main() {
ctx := context.Background()
c := cache.New(memory.NewEncoding(), cache.WithDataOption(cache.WithMarshal(gob.Unmarshal, gob.Marshal)))
var cached string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not found key", &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, "key", "some value"))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
}
Output: err: cache miss: encoding, value: '' err: <nil> err: <nil>, value: 'some value'
Example (Lru) ¶
package main
import (
"context"
"fmt"
"time"
glru "github.com/hashicorp/golang-lru"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/lru"
)
func main() {
ctx := context.Background()
client, _ := glru.New(10)
c := cache.New(lru.New(client), cache.WithDataOption(cache.WithTTL(time.Hour)))
var cached string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not found lru key", &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, "key", "some lru value"))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
fmt.Printf("deleted err: %v\n", c.Delete(ctx, "key"))
}
Output: err: cache miss: lru, value: '' err: <nil> err: <nil>, value: 'some lru value' deleted err: <nil>
Example (Map) ¶
package main
import (
"context"
"fmt"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
ctx := context.Background()
c := cache.New(memory.NewMap())
var cached string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not found key", &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, "key", "some value"))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
}
Output: err: cache miss: map, value: '' err: <nil> err: <nil>, value: 'some value'
Example (Memacache) ¶
package main
import (
"context"
"fmt"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/memcache"
"gitoa.ru/go-4devs/cache/test"
)
func main() {
ctx := context.Background()
c := cache.New(memcache.New(test.MemcacheClient()), cache.WithDataOption(cache.WithNamespace("memcache", ":")))
var cached string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not found memcached key", &cached), cached)
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not:found:memcached:key", &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, "key", "some mamcache value"))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
}
Output: err: key is not valid: memcache, value: '' err: cache miss: memcache, value: '' err: <nil> err: <nil>, value: 'some mamcache value'
Example (Redis) ¶
package main
import (
"context"
"fmt"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/redis"
"gitoa.ru/go-4devs/cache/test"
)
func main() {
ctx := context.Background()
c := cache.New(redis.New(test.RedisClient()))
var cached string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "not found redis key", &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, "key", "some redis value", cache.WithNamespace("redis", ":")))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, "redis:key", &cached), cached)
}
Output: err: cache miss: redis pool, value: '' err: <nil> err: <nil>, value: 'some redis value'
Example (WithFallback) ¶
package main
import (
"context"
"fmt"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/mw"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
ctx := context.Background()
c := cache.New(provider(), mw.WithFallback(
func(ctx context.Context, key, value interface{}) error {
fmt.Printf("loaded key: %#v\n", key)
return cache.TypeAssert("some loaded data", value)
},
func(i *cache.Item, e error) bool {
return e != nil
},
))
var cached, cached2 string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached), cached)
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached2), cached2)
}
func provider() cache.Provider {
return memory.NewMap()
}
Output: loaded key: 1 err: <nil>, value: 'some loaded data' err: <nil>, value: 'some loaded data'
Example (WithMetrics) ¶
package main
import (
"context"
"fmt"
prom "github.com/prometheus/client_golang/prometheus"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/mw"
"gitoa.ru/go-4devs/cache/mw/prometheus"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
ctx := context.Background()
cacheLabel := "cache_label"
c := cache.New(provider(),
mw.WithMetrics(prometheus.Metrics{}, mw.LabelName(cacheLabel)),
cache.WithDataOption(cache.WithNamespace("metrics", ":")),
)
var cached, cached2 string
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached), cached)
fmt.Printf("err: %v\n", c.Set(ctx, 1, "cached"))
fmt.Printf("err: %v, value: '%v'\n", c.Get(ctx, 1, &cached2), cached2)
mfs, _ := prom.DefaultGatherer.Gather()
for _, mf := range mfs {
for _, metric := range mf.GetMetric() {
label := metric.GetLabel()
if len(label) > 0 && metric.Counter != nil {
fmt.Printf("name:%s, label:%s, value: %.0f\n", *mf.Name, *label[0].Value, mf.GetMetric()[0].Counter.GetValue())
}
}
}
}
func provider() cache.Provider {
return memory.NewMap()
}
Output: err: cache miss: map, value: '' err: <nil> err: <nil>, value: 'cached' name:cache_hit_total, label:cache_label, value: 1 name:cache_miss_total, label:cache_label, value: 1
Example (WithNamespace) ¶
package main
import (
"context"
"fmt"
"time"
"gitoa.ru/go-4devs/cache"
"gitoa.ru/go-4devs/cache/provider/memory"
)
func main() {
ctx := context.Background()
c := cache.New(provider(), cache.WithDataOption(
cache.WithNamespace("prefix", ":"),
cache.WithTTL(time.Hour),
))
var cached, cached2 string
fmt.Printf("prefix err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
fmt.Printf("prefix err: %v\n", c.Set(ctx, "key", "some value", cache.WithTTL(time.Minute)))
fmt.Printf("prefix2 err: %v\n", c.Set(ctx, "key", "some value2", cache.WithNamespace("prefix2", ":")))
fmt.Printf("prefix err: %v, value: '%v'\n", c.Get(ctx, "key", &cached), cached)
fmt.Printf("prefix2 err: %v, value: '%v'\n", c.Get(ctx, "key", &cached2, cache.WithNamespace("prefix2", ":")), cached2)
}
func provider() cache.Provider {
return memory.NewMap()
}
Output: prefix err: cache miss: map, value: '' prefix err: <nil> prefix2 err: <nil> prefix err: <nil>, value: 'some value' prefix2 err: <nil>, value: 'some value2'
func (*Cache) Delete ¶ added in v0.1.0
Delete handles middlewares and delete value by key and options.
type Configure ¶ added in v0.1.0
type Configure func(*Cache)
Configure configure cache.
func WithDataOption ¶ added in v0.1.0
WithDataOption sets cache default data options.
func WithDefaultNamespace ¶ added in v0.2.0
WithDefaultNamespace sets cache default namespace.
func WithDefaultTTL ¶ added in v0.2.0
WithDefaultTTL sets cache default ttl.
func WithHandleDelete ¶ added in v0.1.0
WithHandleDelete add a handler for the delete operation.
func WithHandleGet ¶ added in v0.1.0
WithHandleGet add a handler for the get operation.
func WithHandleOperation ¶ added in v0.2.0
WithHandleOperation add a handler for the operation.
func WithHandleSet ¶ added in v0.1.0
WithHandleSet add a handler for the set operation.
func WithMiddleware ¶ added in v0.2.0
WithMiddleware sets middleware to provider.
type ErrorTarget ¶ added in v0.0.2
type ErrorTarget struct {
// contains filtered or unexported fields
}
ErrorTarget errs target is not a settable.
func NewErrorTarget ¶ added in v0.0.2
func NewErrorTarget(target interface{}) ErrorTarget
NewErrorTarget creates new target error.
type Handle ¶ added in v0.1.0
Handle middleware before/after provider.
func ChainHandle ¶ added in v0.2.0
ChainHandle chain handle middleware.
type Item ¶ added in v0.1.0
type Item struct {
Key Key
Value interface{}
TTL time.Duration
// contains filtered or unexported fields
}
Item to pass to the provider.
func (*Item) TTLInSecond ¶ added in v0.1.0
TTLInSecond to set the ttl in seconds.
type Option ¶ added in v0.1.0
type Option func(*Item)
Option ffor the configuration item.
func WithMarshal ¶ added in v0.2.0
WithMarshal sets marshal and unmarshal.
func WithNamespace ¶ added in v0.1.0
WithNamespace sets prefix and separator.