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

仓库地址 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!