一个零 GC 的缓存库:freecache(一个零件的形状大小如下图它的表面积是多少平方厘米)

网友投稿 1503 2022-08-19

一个零 GC 的缓存库:freecache(一个零件的形状大小如下图它的表面积是多少平方厘米)

一个零 GC 的缓存库:freecache(一个零件的形状大小如下图它的表面积是多少平方厘米)

商业世界里,现金为王;架构世界里,缓存为王。

今天给大家推荐一个零 GC 开销、高并发性能的缓存库:FreeCache,项目地址:https://github.com/coocood/freecache,Star 数:2.5k+。

我们知道内存中的对象长期存在会带来昂贵的 GC 开销,使用 FreeCache,你## 特性

能存储数亿个条目

零 GC 开销

高并发线程安全访问

纯 Go 实现

过期支持

类似 LRU 算法

严格限制内存使用

附带一个小服务器,支持带有管道功能的基本 Redis 命令

迭代器支持

性能

这是基准测试结果与内置 map 的比较结果;Set 性能比内置 map 快约 2 倍;Get 性能比内置 map 慢约 1/2 倍。由于它是基于单线程做的基准测试,因此在多线程环境中,FreeCache 应该比单锁保护的内置 map 快许多倍。

BenchmarkCacheSet 3000000 446 ns/op

BenchmarkMapSet 2000000 861 ns/op

BenchmarkCacheGet 3000000 517 ns/op

BenchmarkMapGet 10000000 212 ns/op

使用示例

cacheSize := 100 * 1024 * 1024

cache := freecache.NewCache(cacheSize)

debug.SetGCPercent(20)

key := []byte("abc")

val := []byte("def")

expire := 60 // expire in 60 seconds

cache.Set(key, val, expire)

got, err := cache.Get(key)

if err != nil {

fmt.Println(err)

} else {

fmt.Println(string(got))

}

affected := cache.Del(key)

fmt.Println("deleted key ", affected)

fmt.Println("entry count ", cache.EntryCount())

val := [它怎么做到零 GC 开销的?

FreeCache 通过减少指针数量避免了 GC 开销。无论其中存储了多少条目,都只有 512 个指针。通过 key 的哈希值将数据集分割为 256 个段。每个段只有两个指针,一个是存储键和值的环形缓冲区,另一个是用于查找条目的索引切片。每个段都有自己的锁,因此它支持高并发访问。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用 Go 和 LLVM 进行 Web Assembly 的高效前端开发(使用口罩的方法错误的是)
下一篇:Micro In Action(一):入门(microsoft)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~