分享一个简单高效的内存缓存库
仓库地址 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 协议》,转载必须注明作者和本文链接