Golang Go语言分享一个轻量级的内存KV缓存库,基于hashmap和heap实现
仓库地址: 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
有没有和现有的主流方法进行比较实验呢
更多关于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策略)。
如果您打算自己实现一个轻量级的缓存库,建议考虑以下几点:
- 线程安全:确保您的实现是线程安全的,特别是在并发访问的场景下。
- 性能优化:针对HashMap的哈希函数和Heap的插入、删除操作进行优化,以提高缓存的读写性能。
- 缓存淘汰策略:除了LRU,还可以考虑实现其他策略,如FIFO(先进先出)或TTL(时间到过期)。
- 内存管理:注意监控和限制缓存使用的内存,以防止内存泄漏或过度使用。
最后,建议在实际项目中充分测试您的缓存库,以确保其稳定性和可靠性。希望这些建议对您有所帮助!