V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz
V2EX  ›  Go 编程语言

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

  •  
  •   Nazz · 2023-10-27 15:00:38 +08:00 · 1423 次点击
    这是一个创建于 393 天前的主题,其中的信息可能已经有所发展或是发生改变。

    仓库地址: 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
    
    第 1 条附言  ·  2023-10-28 10:54:13 +08:00

    1,000,000个key, 并行测试 (RunParallel)

    go test -benchmem -run=^$ -bench . github.com/lxzan/memorycache/benchmark
    goos: darwin
    goarch: arm64
    pkg: github.com/lxzan/memorycache/benchmark
    BenchmarkMemoryCache_Set-8   	 7295934	       153.1 ns/op	      25 B/op	       0 allocs/op
    BenchmarkMemoryCache_Get-8   	23053038	        50.43 ns/op	       0 B/op	       0 allocs/op
    BenchmarkRistretto_Set-8     	12036328	       217.1 ns/op	     123 B/op	       2 allocs/op
    BenchmarkRistretto_Get-8     	16294044	        75.40 ns/op	      17 B/op	       1 allocs/op
    PASS
    ok  	github.com/lxzan/memorycache/benchmark	13.268s
    
    第 2 条附言  ·  2023-10-28 12:37:46 +08:00
    go test -benchmem -run=^$ -bench . github.com/lxzan/memorycache/benchmark
    goos: linux
    goarch: amd64
    pkg: github.com/lxzan/memorycache/benchmark
    cpu: AMD Ryzen 5 PRO 4650G with Radeon Graphics
    BenchmarkMemoryCache_Set-12      6762400               150.7 ns/op            27 B/op          0 allocs/op
    BenchmarkMemoryCache_Get-12     28543896                43.41 ns/op            0 B/op          0 allocs/op
    BenchmarkRistretto_Set-12       11597167               264.8 ns/op           121 B/op          2 allocs/op
    BenchmarkRistretto_Get-12       22389213                48.94 ns/op           16 B/op          1 allocs/op
    PASS
    ok      github.com/lxzan/memorycache/benchmark  14.818s
    
    9 条回复    2023-10-27 22:11:19 +08:00
    rainboat
        1
    rainboat  
       2023-10-27 15:17:44 +08:00 via iPhone
    有没有和现有的主流方法进行比较实验呢
    Nazz
        2
    Nazz  
    OP
       2023-10-27 15:34:32 +08:00
    @rainboat 实现方面比它们简单轻量, 性能应该更好些, 因为简单, 考虑的问题没有那么全面.
    Nazz
        3
    Nazz  
    OP
       2023-10-27 15:41:22 +08:00
    @rainboat 对比下这篇文章

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

    感觉主贴是不是把 eviction 和 GC 混在一起说了。
    Nazz
        8
    Nazz  
    OP
       2023-10-27 22:05:29 +08:00
    @GrayXu 明天再对比下 freecache 和 ristretto, 对齐参数挺麻烦.
    Nazz
        9
    Nazz  
    OP
       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
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2728 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:04 · PVG 23:04 · LAX 07:04 · JFK 10:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.