From cf1dcdf46aefb14062c47045f7ae5b9432304c0f Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Thu, 19 Aug 2021 16:16:16 +0200 Subject: [PATCH] use ttlcache --- README.md | 1 + go.mod | 1 + go.sum | 4 ++++ internal/cache/cache.go | 15 ++++++--------- internal/cache/fetch.go | 9 ++------- internal/cache/store.go | 9 +-------- internal/cache/sweep.go | 42 ----------------------------------------- 7 files changed, 15 insertions(+), 66 deletions(-) delete mode 100644 internal/cache/sweep.go diff --git a/README.md b/README.md index 5a64dfa4f..110112750 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ The following libraries and frameworks are used by GoToSocial, with gratitude * [mvdan/xurls](https://github.com/mvdan/xurls); URL parsing regular expressions. [BSD-3-Clause License](https://spdx.org/licenses/BSD-3-Clause.html). * [nfnt/resize](https://github.com/nfnt/resize); convenient image resizing. [ISC License](https://spdx.org/licenses/ISC.html). * [oklog/ulid](https://github.com/oklog/ulid); sequential, database-friendly ID generation. [Apache-2.0 License](https://spdx.org/licenses/Apache-2.0.html). +* [ReneKroon/ttlcache](https://github.com/ReneKroon/ttlcache); in-memory caching. [MIT License](https://spdx.org/licenses/MIT.html). * [russross/blackfriday](https://github.com/russross/blackfriday); markdown parsing for statuses. [Simplified BSD License](https://spdx.org/licenses/BSD-2-Clause.html). * [sirupsen/logrus](https://github.com/sirupsen/logrus); logging. [MIT License](https://spdx.org/licenses/MIT.html). * [stretchr/testify](https://github.com/stretchr/testify); test framework. [MIT License](https://spdx.org/licenses/MIT.html). diff --git a/go.mod b/go.mod index 10597a06b..e6790ccfc 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/superseriousbusiness/gotosocial go 1.16 require ( + github.com/ReneKroon/ttlcache v1.7.0 github.com/buckket/go-blurhash v1.1.0 github.com/coreos/go-oidc/v3 v3.0.0 github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index 4d6968ada..a05bbcd4e 100644 --- a/go.sum +++ b/go.sum @@ -33,6 +33,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ReneKroon/ttlcache v1.7.0 h1:8BkjFfrzVFXyrqnMtezAaJ6AHPSsVV10m6w28N/Fgkk= +github.com/ReneKroon/ttlcache v1.7.0/go.mod h1:8BGGzdumrIjWxdRx8zpK6L3oGMWvIXdvB2GD1cfvd+I= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4= @@ -425,6 +427,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY= +go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4= +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 5a570cad4..eb3744cfe 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -19,8 +19,9 @@ package cache import ( - "sync" "time" + + "github.com/ReneKroon/ttlcache" ) // Cache defines an in-memory cache that is safe to be wiped when the application is restarted @@ -30,19 +31,15 @@ type Cache interface { } type cache struct { - stored *sync.Map + c *ttlcache.Cache } // New returns a new in-memory cache. func New() Cache { + c := ttlcache.NewCache() + c.SetTTL(30 * time.Second) cache := &cache{ - stored: &sync.Map{}, + c: c, } - go cache.sweep() return cache } - -type cacheEntry struct { - updated time.Time - value interface{} -} diff --git a/internal/cache/fetch.go b/internal/cache/fetch.go index 540e9707e..c107b9b26 100644 --- a/internal/cache/fetch.go +++ b/internal/cache/fetch.go @@ -19,15 +19,10 @@ package cache func (c *cache) Fetch(k string) (interface{}, error) { - ceI, stored := c.stored.Load(k) + i, stored := c.c.Get(k) if !stored { return nil, ErrNotFound } - ce, ok := ceI.(*cacheEntry) - if !ok { - panic("cache entry was not a *cacheEntry -- this should never happen") - } - - return ce.value, nil + return i, nil } diff --git a/internal/cache/store.go b/internal/cache/store.go index 50aa08cfc..6b4024476 100644 --- a/internal/cache/store.go +++ b/internal/cache/store.go @@ -18,14 +18,7 @@ package cache -import "time" - func (c *cache) Store(k string, v interface{}) error { - ce := &cacheEntry{ - updated: time.Now(), - value: v, - } - - c.stored.Store(k, ce) + c.c.Set(k, v) return nil } diff --git a/internal/cache/sweep.go b/internal/cache/sweep.go deleted file mode 100644 index e3b19f6a4..000000000 --- a/internal/cache/sweep.go +++ /dev/null @@ -1,42 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package cache - -import "time" - -// sweep removes all entries more than 5 minutes old, on a loop. -func (c *cache) sweep() { - t := time.NewTicker(5 * time.Minute) - for range t.C { - toRemove := []interface{}{} - c.stored.Range(func(key interface{}, value interface{}) bool { - ce, ok := value.(*cacheEntry) - if !ok { - panic("cache entry was not a *cacheEntry -- this should never happen") - } - if ce.updated.Add(5 * time.Minute).After(time.Now()) { - toRemove = append(toRemove, key) - } - return true - }) - for _, r := range toRemove { - c.stored.Delete(r) - } - } -}