golang,go,博客,开源,编程

golang每日一库之VictoriaMetrics/fastcache

Updated on with 0 views and 0 comments

VictoriaMetrics/fastcache 是由 VictoriaMetrics 开发的一个高性能、线程安全的内存缓存库,旨在作为 Go 语言标准库 map 的高效替代方案,用于缓存键值对(key-value pairs)。

它在性能、并发处理能力和内存利用率方面表现优异,尤其适用于对性能要求较高的应用场景,如监控系统、代理服务、数据库中间件等。

它的缺点像它的优点一样明显。

它比 BigCache快!


先说优点

  1. 高性能、低延迟
    • 使用内存池和分段锁,最大程度减少 GC 压力。
    • 单个缓存实例可以并发处理多个读写操作。
  2. 内存管理高效
    • 自动淘汰(eviction)策略:当缓存容量达到上限时,会自动丢弃旧的数据。
    • 使用预分配大内存块的方式来减少碎片。
  3. 线程安全
    • 适用于高并发场景。
  4. 轻量级
    • API 简洁,易于集成和使用。

再说缺点

  • fastcache 并不是持久化缓存。如果你需要跨进程/重启持久化数据,考虑其他方案(如 Redis、BoltDB)。如果你一定要持久化,其实么也可以。
  • 不是 LRU/TTL 缓存,它只在空间用尽时自动清理旧数据。
  • 不适合需要缓存超大 value(默认限制 64KB 单个 entry)。

安装

使用 go get 安装:

go get github.com/VictoriaMetrics/fastcache

🌰

package main

import (
    "fmt"
    "github.com/VictoriaMetrics/fastcache"
)

func main() {
    // 创建一个最大容量为 1GB 的缓存
    cache := fastcache.New(1 * 1024 * 1024 * 1024) // 1GB

    key := []byte("myKey")
    value := []byte("myValue")

    // 设置缓存
    cache.Set(key, value)

    // 获取缓存
    got := cache.Get(nil, key)
    if got != nil {
        fmt.Printf("Cache hit: %s\n", got)
    } else {
        fmt.Println("Cache miss")
    }

    // 删除缓存(不是强制的)
    cache.Del(key)
}

API 简单

函数名描述
New(maxBytes)创建一个新的缓存实例,容量为 maxBytes字节。
Set(k, v)设置键值对;若缓存已满,则淘汰旧数据。
Get(dst, k)获取 key 对应的值,若存在则将值写入 dst后返回。
Del(k)删除 key(不是强制的,因为缓存自动淘汰)。
Has(k)判断缓存中是否存在某个 key。
Reset()清空所有缓存数据。
MarshalTo()/UnmarshalFrom()用于持久化缓存内容到磁盘或从磁盘恢复。

原理

  • 内部使用了sharding 和 ring buffer。
  • 每个 segment 维护自己的缓存空间和锁,避免全局锁竞争。
  • 类似于 BigCacheFreeCache,但更加偏向性能优化而非复杂功能。

性能

sync.Map 和标准的 map+sync.RWMutex 相比,在多数读写场景中性能优越:

  • 高 QPS(百万级)
  • 低内存分配(少 GC)
  • 快速淘汰过期数据

可能的应用场景

  • Prometheus 或其他时间序列数据库的标签缓存
  • 反向代理缓存请求头或响应体
  • 高频率热点数据缓存,如 session、token 等
  • 中间件中的中间结果缓存

简单介绍到这,项目代码量很少, 感兴趣的道友建议直接阅读源码,。


标题:golang每日一库之VictoriaMetrics/fastcache
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/05/26/1748220624686.html
联系:scotttu@163.com