Golang中有哪些优秀的缓存库推荐?
Golang中有哪些优秀的缓存库推荐? 大家好! 🙂
我正在为我的后端框架 go4lage 寻找一个合适的缓存库。
它需要存储大量条目,例如最多 500 万个,大小从 1kB 到 5mB 不等。(大多数条目会比较小)
目前我正在测试相对时间持续时间和内存消耗。
到目前为止,我最喜欢的是 freecache package - github.com/coocood/freecache - Go Packages
我还应该将哪些其他包纳入测试?我打算将完整的测试套件和结果作为开源项目分享。
更多关于Golang中有哪些优秀的缓存库推荐?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
如果您不介意用如此庞大的数据集测试一下这个围绕 map 的小型封装库,我将不胜感激。
更多关于Golang中有哪些优秀的缓存库推荐?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
它从来就不是为了追求速度而设计的。它没有针对高负载进行优化,只是为默认的 map 提供了一些有用的 API。我原本只是希望看到一些数据,但无论如何还是感谢你尝试了它。
啊,那我明白了。
总的来说,我认为主要结论是,你必须根据需求选择合适的缓存。
要做一个通用的基准测试似乎非常困难。
另一个结论是,Go 内置的 sync.Mutex 相关功能开箱即用,性能表现非常出色。
虽然来得有点晚,但这个项目或许值得一看:
creativecreature/sturdyc: 一个具有高级并发功能的缓存库,旨在使I/O密集型应用程序健壮且高性能
(免责声明:我尚未使用过它,也未与其他库进行比较)
Karl:
我还应该在测试中包含哪些其他包?
GitHub - dgraph-io/ristretto: 一个高性能的内存绑定 Go 缓存
一个高性能的内存绑定 Go 缓存
我尝试引入了 GitHub - emar-kar/cache,它确实能工作,但速度太慢了,大概慢了9倍左右,所以我不得不把它移除。我确信它在某些场景下是很好的,也许是我用错了?我的意思是它有很多我用不到的选项。
我查看了测试代码,可以解释为什么它开箱即用时会如此糟糕地失败。由于它允许存储 any,我使用了 gob 来进行大小评估。这看起来更通用,但需要付出编码的代价。既然在你的实验中只使用了 []byte,你可以通过选项设置大小函数,让它直接返回内容的长度。在这种情况下,它可以更公平地进行竞争。而且由于内部没有置换方法,我建议移除大小限制,否则在某些时候,它会在没有添加新项目的情况下开始报错,提示超出大小限制。我在本地用你的基准测试进行了验证,结果并没有那么糟糕。
func main() {
fmt.Println("hello world")
}
在Go中处理大规模缓存时,除了freecache,以下几个库值得纳入测试:
1. BigCache 专注于高并发和大数据量场景,通过分片减少锁竞争。
import "github.com/allegro/bigcache"
cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute))
cache.Set("key1", []byte("value1"))
entry, _ := cache.Get("key1")
2. Ristretto 由Dgraph开发,采用TinyLFU淘汰策略,适合混合工作负载。
import "github.com/dgraph-io/ristretto"
cache, _ := ristretto.NewCache(&ristretto.Config{
NumCounters: 1e7, // 键跟踪数量
MaxCost: 1 << 30, // 最大成本(字节)
BufferItems: 64, // 优化并发
})
cache.Set("key", "value", 1)
value, found := cache.Get("key")
3. GCache 提供多种淘汰策略(LRU、LFU、ARC),支持过期时间。
import "github.com/bluele/gcache"
cache := gcache.New(5000000).
LRU().
Build()
cache.SetWithExpire("key", "value", 10*time.Minute)
value, err := cache.Get("key")
4. GroupCache 支持分布式缓存,内置防击穿机制。
import "github.com/golang/groupcache"
var cache = groupcache.NewGroup("large-data", 5<<30, groupcache.GetterFunc(
func(ctx context.Context, key string, dest groupcache.Sink) error {
// 数据加载逻辑
dest.SetBytes([]byte("value"))
return nil
},
))
测试建议关注指标:
- 内存效率(尤其5MB大对象)
- 并发性能(goroutine竞争)
- 淘汰策略准确性
- GC压力(避免全局锁)
freecache的优势在于零GC压力,但大对象存储可能产生碎片。建议用实际数据模式测试这些库,期待看到您的测试结果。

