commit f52d18c16bccdb6063c28b556cf1167057cceebf Author: Yun Date: Fri Nov 24 22:28:22 2023 +0800 缓存 diff --git a/cachex.go b/cachex.go new file mode 100644 index 0000000..57b843e --- /dev/null +++ b/cachex.go @@ -0,0 +1,68 @@ +package cachex + +import ( + "sync" + "time" +) + +// 应用内缓存 +// 特点 +// 1.全局单实例 +// 到设定的点就删除 + +type cache struct{ + store sync.Map +} +var one sync.Once +var c cache + +type cacheData struct { + key string + data interface{} + expire time.Time +} + +func NewCache() *cache { + one.Do(func() { + c = cache{} + + go func(){ + for { + c.store.Range(func(key, value interface{}) bool { + if value.(*cacheData).expire.Before(time.Now()) { + c.store.Delete(key) + } + return true + }) + + time.Sleep(time.Second * 5) + } + }() + }) + return &c +} + +// 设置缓存 +func (c *cache) Set(key string, value interface{}, expire time.Duration) { + cd := &cacheData{key, value, time.Now().Add(expire)} + c.store.Store(key, cd) +} + +// 读取缓存 +func (c *cache) Get(key string) interface{} { + if v, ok := c.store.Load(key); ok { + + cc := v.(*cacheData) + if cc.expire.Before(time.Now()) { + c.store.Delete(key) + return nil + } + return cc.data + } + return nil +} + +// 删除缓存 +func (c *cache) Delete(key string) { + c.store.Delete(key) +} diff --git a/cachex_test.go b/cachex_test.go new file mode 100644 index 0000000..4ffd76c --- /dev/null +++ b/cachex_test.go @@ -0,0 +1,20 @@ +package cachex_test + +import ( + "fmt" + "testing" + "time" + + "code.yun.ink/pkg/cachex" +) + +func TestCache(t *testing.T) { + cachex.NewCache().Set("test", "test", time.Second*5) + + da := cachex.NewCache().Get("test") + fmt.Println(da) + + time.Sleep(time.Second *5) + da = cachex.NewCache().Get("test") + fmt.Println(da) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..acb7703 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module "code.yun.ink/pkg/cachex" + +go 1.19