分享一个简单高效的内存缓存库

仓库地址 github.com/lxzan/memorycache#

简介#

极简的内存 KV 存储,由 hashmap 和 heap 实现,没有做 GC 优化.
它的读取效率为 O (1), 写入效率为 O (logN).
缓存淘汰策略: Set 方法清理溢出的键;定时器清理过期的键.

特性#

  • 存储数据限制:受最大容量限制
  • 过期时间:支持
  • 缓存淘汰策略: 类似 LRU, Set 方法和周期清理
  • GC 优化:无
  • 持久化:无
  • 锁机制:分片 + 互斥锁

使用#

package main

import (
    "fmt"
    "github.com/lxzan/memorycache"
    "time"
)

func main() {
    mc := memorycache.New(
        memorycache.WithBucketNum(16),
        memorycache.WithBucketSize(1000, 100000),
        memorycache.WithInterval(100*time.Millisecond),
    )

    mc.Set("xxx", 1, 500*time.Millisecond)

    val, exist := mc.Get("xxx")
    fmt.Printf("val=%v, exist=%v\n", val, exist)

    time.Sleep(time.Second)

    val, exist = mc.Get("xxx")
    fmt.Printf("val=%v, exist=%v\n", val, exist)
}

压测#

  • 1,000,000 elements
    go test -benchmem -run=^$ -bench . github.com/lxzan/memorycache/benchmark
    goos: darwin
    goarch: arm64
    pkg: github.com/lxzan/memorycache/benchmark
    BenchmarkMemoryCache_Set-8        7038808           153.9 ns/op          26 B/op           0 allocs/op
    BenchmarkMemoryCache_Get-8       22969712            50.92 ns/op           0 B/op           0 allocs/op
    BenchmarkRistretto_Set-8         13417420           242.9 ns/op         138 B/op           2 allocs/op
    BenchmarkRistretto_Get-8         15895714            75.81 ns/op          18 B/op           1 allocs/op
    PASS
    ok      github.com/lxzan/memorycache/benchmark    10.849s
本作品采用《CC 协议》,转载必须注明作者和本文链接