今天给大家推荐一个零 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 个段。每个段只有两个指针,一个是存储键和值的环形缓冲区,另一个是用于查找条目的索引切片。每个段都有自己的锁,因此它支持高并发访问。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7120/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取