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

2023-10-27 15:00:38 +08:00
 Nazz

仓库地址: 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
1413 次点击
所在节点    Go 编程语言
9 条回复
rainboat
2023-10-27 15:17:44 +08:00
有没有和现有的主流方法进行比较实验呢
Nazz
2023-10-27 15:34:32 +08:00
@rainboat 实现方面比它们简单轻量, 性能应该更好些, 因为简单, 考虑的问题没有那么全面.
Nazz
2023-10-27 15:41:22 +08:00
@rainboat 对比下这篇文章

存储数据限制: 受最大容量限制
过期时间: 支持
缓存淘汰策略: 周期清理
GC: GO GC
GC 优化原理: 无优化
锁机制: 分片+互斥锁
Nazz
2023-10-27 15:44:09 +08:00
matrix1010
2023-10-27 16:41:13 +08:00
看到你的对比图我立刻想到了以前看到的鹅厂 tcache: https://zhuanlan.zhihu.com/p/624248354
Nazz
2023-10-27 16:48:59 +08:00
@matrix1010 我转发的
GrayXu
2023-10-27 20:53:59 +08:00
KV cache 的性能挺好对比的,建议跑个 benchmark 。

感觉主贴是不是把 eviction 和 GC 混在一起说了。
Nazz
2023-10-27 22:05:29 +08:00
@GrayXu 明天再对比下 freecache 和 ristretto, 对齐参数挺麻烦.
Nazz
2023-10-27 22:11:19 +08:00
@GrayXu 使用默认参数做个简单测试

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/986032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX