Golang Go语言分享一个轻量级的内存KV缓存库,基于hashmap和heap实现

发布于 1周前 作者 ionicwang 来自 Go语言

仓库地址: https://github.com/lxzan/memorycache

介绍

轻量级的内存 KV 存储, 由哈希图和最小堆实现, 没有特别为 GC 做优化. 拥有 O(1)的读取效率, O(logN)的写入效率. 缓存淘汰策略: 检测到过期或者容量溢出时, 堆顶元素会被清除一部分, 每次至多删除 16*1000(默认值, 后面省略)个 key, 30s 检查一次.

简单压测

go test -benchmem -run=^$ -bench . github.com/lxzan/memorycache/benchmark
goos: darwin
goarch: arm64
pkg: github.com/lxzan/memorycache/benchmark
BenchmarkSet/10000-8            13830640                87.25 ns/op            0 B/op          0 allocs/op
BenchmarkSet/1000000-8           3615801               326.6 ns/op            58 B/op          0 allocs/op
BenchmarkGet/10000-8            14347058                82.28 ns/op            0 B/op          0 allocs/op
BenchmarkGet/1000000-8           3899768               262.6 ns/op            54 B/op          0 allocs/op
PASS
ok      github.com/lxzan/memorycache/benchmark  13.037s

Golang Go语言分享一个轻量级的内存KV缓存库,基于hashmap和heap实现

更多关于Golang Go语言分享一个轻量级的内存KV缓存库,基于hashmap和heap实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

有没有和现有的主流方法进行比较实验呢

更多关于Golang Go语言分享一个轻量级的内存KV缓存库,基于hashmap和heap实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


实现方面比它们简单轻量, 性能应该更好些, 因为简单, 考虑的问题没有那么全面.

对比下这篇文章

存储数据限制: 受最大容量限制
过期时间: 支持
缓存淘汰策略: 周期清理
GC: GO GC
GC 优化原理: 无优化
锁机制: 分片+互斥锁

看到你的对比图我立刻想到了以前看到的鹅厂 tcache: https://zhuanlan.zhihu.com/p/624248354

KV cache 的性能挺好对比的,建议跑个 benchmark 。

感觉主贴是不是把 eviction 和 GC 混在一起说了。

明天再对比下 freecache 和 ristretto, 对齐参数挺麻烦.

使用默认参数做个简单测试

<br>go test -benchmem -run=^$ -bench . <a target="_blank" href="http://github.com/lxzan/memorycache/benchmark" rel="nofollow noopener">github.com/lxzan/memorycache/benchmark</a><br>goos: darwin<br>goarch: arm64<br>pkg: <a target="_blank" href="http://github.com/lxzan/memorycache/benchmark" rel="nofollow noopener">github.com/lxzan/memorycache/benchmark</a><br>BenchmarkMemoryCacheSet/10000-8 13762460 86.71 ns/op 0 B/op 0 allocs/op<br>BenchmarkMemoryCacheSet/1000000-8 3560780 320.7 ns/op 59 B/op 0 allocs/op<br>BenchmarkMemoryCacheGet/10000-8 14570577 81.50 ns/op 0 B/op 0 allocs/op<br>BenchmarkMemoryCacheGet/1000000-8 4752176 240.3 ns/op 44 B/op 0 allocs/op<br>BenchmarkRistrettoSet/10000-8 3887132 312.3 ns/op 110 B/op 2 allocs/op<br>BenchmarkRistrettoSet/1000000-8 3760880 493.4 ns/op 242 B/op 2 allocs/op<br>BenchmarkRistrettoGet/10000-8 9499491 123.7 ns/op 29 B/op 1 allocs/op<br>BenchmarkRistrettoGet/1000000-8 3122341 365.6 ns/op 148 B/op 1 allocs/op<br>PASS<br>ok <a target="_blank" href="http://github.com/lxzan/memorycache/benchmark" rel="nofollow noopener">github.com/lxzan/memorycache/benchmark</a> 35.356s<br>

您好!

针对您分享的关于Go语言中轻量级内存KV(键值对)缓存库的需求,这里有一些专业的见解和建议。

首先,基于hashmap和heap实现的KV缓存库在Go语言中是一个相当实用的设计。HashMap提供了快速的键值查找能力,而Heap则有助于实现高效的缓存淘汰策略,如LRU(最近最少使用)缓存。

在Go语言的生态系统中,已经有一些成熟的、基于这些数据结构的缓存库可供选择,例如golang.org/x/exp/maps/readwritemap(虽然它主要是一个读写锁优化的map,但可以作为参考)和github.com/patrickmn/go-cache(一个更完整的缓存实现,支持LRU和FIFO策略)。

如果您打算自己实现一个轻量级的缓存库,建议考虑以下几点:

  1. 线程安全:确保您的实现是线程安全的,特别是在并发访问的场景下。
  2. 性能优化:针对HashMap的哈希函数和Heap的插入、删除操作进行优化,以提高缓存的读写性能。
  3. 缓存淘汰策略:除了LRU,还可以考虑实现其他策略,如FIFO(先进先出)或TTL(时间到过期)。
  4. 内存管理:注意监控和限制缓存使用的内存,以防止内存泄漏或过度使用。

最后,建议在实际项目中充分测试您的缓存库,以确保其稳定性和可靠性。希望这些建议对您有所帮助!

回到顶部