这是一个简单、简洁的 Go 记忆器。缓存昂贵的函数调用。Go-memoize 已经投入生产几年了。
在内存中缓存昂贵的函数调用,并具有可配置的超时和清除间隔:
import ( "time"
"github.com/kofalt/go-memoize" )
//您希望缓存的任何昂贵调用 expensive := func() (interface{}, error) { time.Sleep(3 * time.Second) return "some data", nil }
// 将昂贵的调用缓存在内存中 90 秒,每 10 分钟清除一次旧条目。 cache := memoize.NewMemoizer(90*time.Second, 10*time.Minute)
// 这将调用昂贵的函数 result, err, cached := cache.Memoize("key1", expensive)
// 这将被缓存 result, err, cached = cache.Memoize("key1", expensive)
// 这将使用新的缓存key,因此再次调用 expensive result, err, cached = cache.Memoize("key2", expensive)
|
在上面的例子中,result是:
- 如果为 false,则函数的返回值cached,或者
- cached如果为 true,则为先前存储的值。
所有困难的东西都被扔到 patrickmn 的go-cache和 Go 团队的x/sync/singleflight中。Singleflight
Singleflight是一个非常有趣的包,它“提供了一个重复的函数调用抑制机制。
假设一个从API或数据库获取数据的应用程序(即几乎任何现有的应用程序)。如果多个请求触发同一个调用,则可能会触发多个相同的数据库或API调用。
这些冗余请求会使您的系统不堪重负,导致CPU周期、内存和带宽的浪费。
通过使用singleflight,我们可以很容易地消除这些重复调用。