Go-memoize:缓存函数调用结果的开源工具


这是一个简单、简洁的 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是:

  1. 如果为 false,则函数的返回值cached,或者
  2. cached如果为 true,则为先前存储的值。

所有困难的东西都被扔到 patrickmn 的go-cache和 Go 团队的x/sync/singleflight中。

Singleflight
Singleflight是一个非常有趣的包,它“提供了一个重复的函数调用抑制机制。

假设一个从API或数据库获取数据的应用程序(即几乎任何现有的应用程序)。如果多个请求触发同一个调用,则可能会触发多个相同的数据库或API调用。 

这些冗余请求会使您的系统不堪重负,导致CPU周期、内存和带宽的浪费。 

 通过使用singleflight,我们可以很容易地消除这些重复调用。