快速、并发、支持淘汰的内存缓存,专为保存大量条目而设计,不影响性能。BigCache 将条目保存在堆上,但避免了垃圾回收。为实现这一点,操作都在字节切片上进行,因此在大多数使用场景中,需要在缓存前进行条目的序列化和反序列化。
需要 Go 1.12 或更新版本。
import ( "fmt" "context" "github.com/allegro/bigcache/v3" ) cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10 * time.Minute)) cache.Set("my-unique-key", []byte("value")) entry, _ := cache.Get("my-unique-key") fmt.Println(string(entry))
当可以预先预测缓存负载时,最好使用自定义初始化,因为这样可以避免额外的内存分配。
import ( "log" "github.com/allegro/bigcache/v3" ) config := bigcache.Config { // 分片数量(必须是 2 的幂) Shards: 1024, // 条目可以被淘汰的时间 LifeWindow: 10 * time.Minute, // 删除过期条目的时间间隔(清理)。 // 如果设置为 <= 0,则不执行任何操作。 // 设置为 < 1 秒会适得其反 — bigcache 的分辨率为一秒。 CleanWindow: 5 * time.Minute, // rps * lifeWindow,仅用于初始内存分配 MaxEntriesInWindow: 1000 * 10 * 60, // 最大条目大小(字节),仅用于初始内存分配 MaxEntrySize: 500, // 打印有关额外内存分配的信息 Verbose: true, // 缓存不会分配超过此限制的内存,单位为 MB // 如果达到此值,则最旧的条目可能会被新条目覆盖 // 0 值表示没有大小限制 HardMaxCacheSize: 8192, // 当最旧的条目因过期时间或没有空间容纳新条目而被删除时,或因调用了删除操作时触发的回调 // 将返回一个表示原因的位掩码。 // 默认值为 nil,表示没有回调,并且阻止解包最旧的条目。 OnRemove: nil, // OnRemoveWithReason 是当最旧的条目因过期时间或没有空间容纳新条目而被删除时,或因调用了删除操作时触发的回调 // 将传递一个表示原因的常量。 // 默认值为 nil,表示没有回调,并且阻止解包最旧的条目。 // 如果指定了 OnRemove,则忽略此项。 OnRemoveWithReason: nil, } cache, initErr := bigcache.New(context.Background(), config) if initErr != nil { log.Fatal(initErr) } cache.Set("my-unique-key", []byte("value")) if entry, err := cache.Get("my-unique-key"); err == nil { fmt.Println(string(entry)) }
LifeWindow 和 CleanWindowLifeWindow 是一个时间。在此时间之后,一个条目可以被称为死亡但不会被删除。
CleanWindow 是一个时间。在此时间之后,所有死亡的条目将被删除,但仍有生命的条目不会被删除。
比较了三种缓存:bigcache、freecache 和 map。 基准测试在配备 32GB RAM 的 Ubuntu 18.04 LTS (5.2.12-050212-generic) 系统上使用 i7-6700K CPU @ 4.00GHz 进行。
基准测试源代码可以在这里找到
go version go version go1.13 linux/amd64
go test -bench=. -benchmem -benchtime=4s ./... -timeout 30m goos: linux goarch: amd64 pkg: github.com/allegro/bigcache/v3/caches_bench BenchmarkMapSet-8 12999889 376 ns/op 199 B/op 3 allocs/op BenchmarkConcurrentMapSet-8 4355726 1275 ns/op 337 B/op 8 allocs/op BenchmarkFreeCacheSet-8 11068976 703 ns/op 328 B/op 2 allocs/op BenchmarkBigCacheSet-8 10183717 478 ns/op 304 B/op 2 allocs/op BenchmarkMapGet-8 16536015 324 ns/op 23 B/op 1 allocs/op BenchmarkConcurrentMapGet-8 13165708 401 ns/op 24 B/op 2 allocs/op BenchmarkFreeCacheGet-8 10137682 690 ns/op 136 B/op 2 allocs/op BenchmarkBigCacheGet-8 11423854 450 ns/op 152 B/op 4 allocs/op BenchmarkBigCacheSetParallel-8 34233472 148 ns/op 317 B/op 3 allocs/op BenchmarkFreeCacheSetParallel-8 34222654 268 ns/op 350 B/op 3 allocs/op BenchmarkConcurrentMapSetParallel-8 19635688 240 ns/op 200 B/op 6 allocs/op BenchmarkBigCacheGetParallel-8 60547064 86.1 ns/op 152 B/op 4 allocs/op BenchmarkFreeCacheGetParallel-8 50701280 147 ns/op 136 B/op 3 allocs/op BenchmarkConcurrentMapGetParallel-8 27353288 175 ns/op 24 B/op 2 allocs/op PASS ok github.com/allegro/bigcache/v3/caches_bench 256.257s
在bigcache中的写入和读取比freecache更快。 对map的写入是最慢的。
go version go version go1.13 linux/amd64 go run caches_gc_overhead_comparison.go 条目数量: 20000000 bigcache的GC暂停时间: 1.506077ms freecache的GC暂停时间: 5.594416ms map的GC暂停时间: 9.347015ms
go version
go version go1.13 linux/arm64
go run caches_gc_overhead_comparison.go
条目数量: 20000000
bigcache的GC暂停时间: 22.382827ms
freecache的GC暂停时间: 41.264651ms
map的GC暂停时间: 72.236853ms
测试显示了填充了2000万条目的缓存的GC暂停时间。 Bigcache和freecache的GC暂停时间非常 相似。
你可能会发现系统内存报告似乎呈指数增长,但这是预期的行为。Go运行时以块或"spans"的形式分配内存,并在不再需要时通过将其状态更改为"空闲"来通知操作系统。在操作系统需要重新利用地址之前,这些"spans"将保留为进程资源使用的一部分。更多相关阅读可以在这里找到。
BigCache依赖于Go 1.5版本中引入的优化(issue-9477)。
这个优化表明,如果使用的map的键和值中没有指针,那么GC将忽略其内容。
因此,BigCache使用map[uint64]uint32,其中键是哈希值,值是条目的偏移量。
条目保存在字节切片中,再次避免GC。 字节切片的大小可以增长到数十亿字节而不影响性能, 因为GC只会看到指向它的单个指针。
BigCache不处理冲突。当插入新项目且其哈希值与先前存储的项目冲突时,新项目会覆盖先前存储的值。
两种缓存提供相同的核心功能,但它们以不同的方式减少GC开销。
Bigcache依赖于map[uint64]uint32,freecache实现了自己的基于
切片的映射以减少指针数量。
上面展示了基准测试的结果。 bigcache相对于freecache的一个优势是,你不需要提前知道 缓存的大小,因为当bigcache满了时, 它可以为新条目分配额外的内存,而不是 像freecache当前那样覆盖现有条目。 然而,bigcache中也可以设置硬性最大大小,请查看HardMaxCacheSize。
这个包还包括一个易于部署的BigCache的HTTP实现,可以在server包中找到。
Bigcache的起源在allegro.tech博客文章中有描述:用Go编写一个非常快的缓存服务
BigCache根据Apache 2.0许可证发布(参见LICENSE)


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频
最新AI工具、AI资讯
独家AI资源 、AI项目落地

微信扫一扫关注公众号