From 859849bd47e663432fbc5c2b4e6df989b2c2fbbc Mon Sep 17 00:00:00 2001 From: Colin Henry Date: Thu, 15 Dec 2022 22:00:51 -0800 Subject: [PATCH] stub of tiered cache --- cache/interface.go | 6 ++++++ cache/tiered.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 cache/interface.go create mode 100644 cache/tiered.go diff --git a/cache/interface.go b/cache/interface.go new file mode 100644 index 0000000..bfb71bf --- /dev/null +++ b/cache/interface.go @@ -0,0 +1,6 @@ +package cache + +type Interface[K comparable, V any] interface { + Get(key K) V + Put(key K, value V) +} diff --git a/cache/tiered.go b/cache/tiered.go new file mode 100644 index 0000000..e538c93 --- /dev/null +++ b/cache/tiered.go @@ -0,0 +1,34 @@ +package cache + +import "reflect" + +type tieredCache[K comparable, V any] struct { + inner Interface[K, V] + outer Interface[K, V] +} + +func NewTieredCache[K comparable, V any](inner, outer Interface[K, V]) Interface[K, V] { + return &tieredCache[K, V]{ + inner: inner, + outer: outer, + } +} + +func (t *tieredCache[K, V]) Get(key K) V { + var zero, value V + value = t.inner.Get(key) + if reflect.DeepEqual(value, zero) { + value = t.outer.Get(key) + // if required, add value to inner cache for future requests + } + return value +} + +func (t *tieredCache[K, V]) Put(key K, value V) { + t.inner.Put(key, value) + + // add key to outer cache asynchronously + go func(key K) { + t.outer.Put(key, value) + }(key) +}