From 00bd2bc65fa18dfe2fd6cbbeee4d7bb94f601b9c Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Wed, 8 Jul 2020 11:08:59 +0100 Subject: [PATCH] cache interface (#1805) --- cache/cache.go | 17 +++++++++++++ cache/memory/memory.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 cache/cache.go create mode 100644 cache/memory/memory.go diff --git a/cache/cache.go b/cache/cache.go new file mode 100644 index 00000000..872aacec --- /dev/null +++ b/cache/cache.go @@ -0,0 +1,17 @@ +// Package cache is a caching interface +package cache + +type Cache interface { + // Initialise options + Init(...Option) error + // Get a value + Get(key string) (interface{}, error) + // Set a value + Set(key string, val interface{}) error + // Delete a value + Delete(key string) error + // Name of the implementation + String() string +} + +type Option struct{} diff --git a/cache/memory/memory.go b/cache/memory/memory.go new file mode 100644 index 00000000..d4246b77 --- /dev/null +++ b/cache/memory/memory.go @@ -0,0 +1,56 @@ +// Package memory is an in memory cache +package memory + +import ( + "sync" + + "github.com/micro/go-micro/v2/cache" + "github.com/micro/go-micro/v2/errors" +) + +type memoryCache struct { + // TODO: use a decent caching library + sync.RWMutex + values map[string]interface{} +} + +func (m *memoryCache) Init(opts ...cache.Option) error { + // TODO: implement + return nil +} + +func (m *memoryCache) Get(key string) (interface{}, error) { + m.RLock() + defer m.RUnlock() + + v, ok := m.values[key] + if !ok { + return nil, errors.NotFound("go.micro.cache", key+" not found") + } + + return v, nil +} + +func (m *memoryCache) Set(key string, val interface{}) error { + m.Lock() + m.values[key] = val + m.Unlock() + return nil +} + +func (m *memoryCache) Delete(key string) error { + m.Lock() + delete(m.values, key) + m.Unlock() + return nil +} + +func (m *memoryCache) String() string { + return "memory" +} + +func NewCache(opts ...cache.Option) cache.Cache { + return &memoryCache{ + values: make(map[string]interface{}), + } +}