Golang Go语言中有什么好用的 cache 方案?

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中有什么好用的 cache 方案?
本来准备直接用 map 做 cache,但 map 不支持 concurrent,并且我还希望能满足下面两点:
- 支持设置 cache 的最大数量
- 支持设置 cache 的最大内存使用量

有什么推荐吗?

18 回复

自己写,两个需求都简单。map 加个锁就行

更多关于Golang Go语言中有什么好用的 cache 方案?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当达到最大数量或内存时,要能自动删除近期最少使用(LRU)的值。
有现成的库吗?自己写好像有点麻烦。

不知道这个能否满足你的要求 https://github.com/ysmood/umi

手撸一个 redis ?

收了,感谢先,近来可能用上

做个计算器,然后用 sync.Map ,没入一个对象,重新计算下内存大小。
感觉都是简单的事情,就是包装个 Add/Dell 方法

小打小闹用 sync.Map

想分布式就麻烦了 自己根据需求挑吧
https://libs.garden/go/search?q=cache&sort=popular

不考虑用 redis 的原因是啥?

LRUCache 很简单,可以做到查找更新都是 log(N)复杂度。

但是 go 这种"modern"语言居然不支持泛型,所以 cache 也用起来难受。

建议用读写锁操作含类型的 map,用 sync.map 会丢失类型,每次都要检查类型很麻烦

本地的话 map 加锁或者 sync.map ,分布式用 redis,有原子操作需求上 lua 脚本。

在Golang中,有多种好用的cache方案可供选择,以下是一些推荐:

  1. Redis Cache Library for Golang

    • 基于Redis作为后端存储的缓存库,由uptrace团队开发,是Uptrace分布式追踪系统的一部分。
    • 采用高效的MessagePack序列化机制,支持可选的本地缓存增强(如TinyLFU),提供内存级别的快速访问。
    • 内建对OpenTelemetry Metrics的支持,便于监控缓存命中率。
  2. Mango Cache

    • 受Google Guava Cache启发的Go语言实现,支持多种缓存替换策略(如LRU、Segmented LRU、TinyLFU)。
    • 特别适用于需要大量读取且数据更新相对较少的应用环境,如API服务缓存、高频访问的数据字典等。
    • 提供灵活的配置选项和直观的监控接口,有助于性能调优和问题排查。
  3. sync.Map

    • Go语言标准库提供的并发安全的map,可用于实现简单的缓存。
    • 使用方便,但缺少过期时间和复杂的缓存替换策略等高级功能。
  4. 第三方库

    • 如go-cache、bigcache等,也提供了丰富的缓存特性。
    • 这些库通常具有良好的社区支持和文档,适合需要快速集成缓存功能的项目。

在选择cache方案时,建议根据项目的具体需求、性能要求以及团队的技术栈进行综合考虑。

回到顶部