高性能、并发安全的 Go 嵌入式缓存库 如何使用?

server/2025/1/20 19:53:50/

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

在 Go 中,嵌入式缓存(in-memory cache)是提高应用程序性能的常见方案。

一个好的缓存库能够提供高效的存储机制、支持高并发访问并保证线程安全。Go 语言中有一些非常高效的嵌入式缓存库,其中 groupcachebigcache 是两个非常流行且高性能的库。

1. groupcache:高性能缓存

groupcache 是由 Google 开发的一个高性能缓存库,专为缓存服务中的数据访问而设计,具有良好的扩展性,并且内建了一些高效的并发控制和缓存失效策略。groupcache 在许多大规模分布式系统中被使用。

安装 groupcache
go get github.com/golang/groupcache
基本使用示例

下面是一个使用 groupcache 实现本地缓存的简单例子。groupcache 会将数据分组存储,并可以通过 getter 函数来加载数据。

package mainimport ("fmt""log""github.com/golang/groupcache"
)// 获取数据的函数,模拟从数据库或远程服务获取数据
func loadData(ctx groupcache.Context, key string, dest groupcache.Sink) error {data := "value_for_" + keydest.SetString(data)return nil
}func main() {// 创建一个 groupcache 缓存// size 参数设置了缓存的大小,groupcache 会根据此参数自动管理缓存大小cache := groupcache.NewGroup("exampleCache", 64<<20, groupcache.GetterFunc(loadData))// 创建一个上下文并获取缓存中的数据var data stringerr := cache.Get(nil, "some_key", groupcache.StringSink(&data))if err != nil {log.Fatal(err)}// 输出缓存的数据fmt.Println(data)
}
关键点:
  • groupcache 使用 group 来管理一组缓存数据,每个缓存的访问会通过 getter 函数动态加载。
  • 缓存数据的加载会通过 getter 来实现,可以从外部数据源(如数据库或 API)加载数据。
  • 支持并发安全,多个请求可以并发访问缓存并从源中加载数据。

2. bigcache:高效的内存缓存

bigcache 是一个针对 Go 的高性能缓存库,它设计的重点是优化并发访问性能,适合高并发场景下的数据缓存。与 groupcache 相比,bigcache 更加专注于内存优化和并发安全,并且支持大数据量的缓存

安装 bigcache
go get github.com/allegro/bigcache/v3
基本使用示例

bigcache 适用于需要存储大量短生命周期的数据的场景,例如 Web 应用中的会话缓存、API 缓存等。

package mainimport ("fmt""log""github.com/allegro/bigcache/v3""time"
)func main() {// 创建一个 bigcache 实例,设置缓存的最大大小和过期时间cache, err := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute))if err != nil {log.Fatal(err)}// 将数据存入缓存,key 为 "user_123",value 为 "John Doe"cache.Set("user_123", []byte("John Doe"))// 从缓存中获取数据entry, err := cache.Get("user_123")if err != nil {log.Fatal(err)}// 输出缓存的数据fmt.Println("Cache entry:", string(entry))
}
关键点:
  • bigcache 可以设置缓存的过期时间,支持自动清理过期缓存
  • 支持并发安全,多个 Goroutine 可以并发读写缓存
  • 对内存的使用进行了优化,尤其适合存储大规模缓存数据。

golanglru_LRU__121">3. golang-lru:最简单的 LRU 缓存

LRU(Least Recently Used,最近最少使用)缓存是一种基于访问时间的缓存淘汰策略。golang-lru 库可以用于实现基于内存的 LRU 缓存。适合用于数据访问量大的情况下进行缓存,超出缓存大小后,系统会自动淘汰最少使用的数据。

golanglru_125">安装 golang-lru
go get github.com/golang/groupcache/lru
基本使用示例
package mainimport ("fmt""github.com/golang/groupcache/lru"
)func main() {// 创建一个容量为 3 的 LRU 缓存cache := lru.New(3)// 设置缓存cache.Add("a", 1)cache.Add("b", 2)cache.Add("c", 3)// 打印缓存内容fmt.Println("Cache after adding 3 elements:", cache)// 添加新的元素,超出缓存容量,最旧的元素会被移除cache.Add("d", 4)fmt.Println("Cache after adding 4th element (eviction occurs):", cache)// 检查是否存在某个元素if val, ok := cache.Get("b"); ok {fmt.Println("Found 'b':", val)} else {fmt.Println("'b' not found")}
}
关键点:
  • golang-lru 使用 LRU 策略管理缓存
  • 数据量超出缓存时,会自动移除最少使用的数据。
  • 适用于需要缓存一定数量的热数据的场景。

4. 缓存选择指南

  • 使用 groupcache:当你需要一个高效的缓存,并且希望缓存是分布式的,支持在多个实例之间共享数据时,groupcache 是一个不错的选择。

    • 支持缓存分片,自动管理缓存的分布和访问。
    • 适合高并发读取,且不经常更新的场景。
  • 使用 bigcache:如果你的应用有大量的并发读写需求,并且缓存的数据量大,bigcache 是更合适的选择。

    • 高并发、低延迟。
    • 适合大量短生命周期数据的缓存,能有效避免 GC 问题。
  • 使用 golang-lru:如果你只需要一个简单的 LRU 缓存,用于管理缓存大小不超过一定阈值的数据,并且缓存丢失时不需要从外部源重新加载数据,golang-lru 是一个简单高效的选择。

    • 适用于缓存存储受限且有淘汰需求的情况。

5. 总结

在 Go 中,高性能并发安全的嵌入式缓存库有很多选择。选择适合自己业务场景的缓存库是非常重要的:

  • groupcache:适用于大规模、分布式缓存场景,特别是需要缓存来自外部服务或数据库的数据。
  • bigcache:适合存储大量数据并且需要高并发访问的场景,适合 Web 服务中的会话缓存、API 缓存等。
  • golang-lru:适用于简单的 LRU 缓存管理,特别是缓存数据量有限时。

每个库都有其独特的优点,根据需求进行选择,可以让你的应用在并发访问和数据缓存方面表现更加优秀。


http://www.ppmy.cn/server/159976.html

相关文章

【MVCC过程中会加锁吗?】

MVCC过程中会加锁吗? 一、MVCC的工作原理二、MVCC的并发控制三、MVCC中的加锁情况在MVCC(Multi-Version Concurrency Control,多版本并发控制)过程中, 通常不需要加锁来控制并发访问。 MVCC是一种数据并发控制技术,它允许在不同的事务中对同一数据进行并发访问,而不需要…

Android中下载 HAXM 报错 HAXM installation failed,如何解决?

AMD芯片的电脑在 Android Studio 中安装 Virtual Device 时&#xff0c;经常会出现一个 问题 Intel HAXM installation failed. To install Intel HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructions-on-Windows 一直提示H…

HTTP:TIME_WAIT累积与端口耗尽

背景&#xff1a;当某个 TCP 端点关闭 TCP 连接时&#xff0c;会在内存中维护一个小的控制块&#xff0c;用来记录最 近所关闭连接的 IP 地址和端口号。这类信息只会维持一小段时间&#xff0c;通常是所估计的 最大分段使用期的两倍(称为 2MSL&#xff0c;通常为 2 分钟 8)左右…

数据结构-栈和队列

文章目录 一、栈1.概念与结构2.数组栈的实现2.1 栈的结构定义2.2 栈的初始化2.3 栈的销毁2.4 栈的判空2.5 栈的入栈2.6 栈的出栈2.7 查看栈顶元素2.8 栈的大小 3.两种栈的图示结构 二、队列1.概念与结构2.链式队列的实现2.1 队列的结构定义2.2 队列的初始化2.3 队列的销毁2.4 队…

SSM课设-学生管理系统

【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

嵌入式驱动开发详解12(LCD驱动)

文章目录 前言LCDLCD 简介LCD屏幕时序单片机eLCDIF接口 Linux 下 LCD 驱动简析Framebuffer 设备设备树配置LCD相关系统设置 后续参考文献 前言 LCD 是现在最常用到的显示器&#xff0c;手机、 电脑、各种人机交互设备等基本都用到了 LCD&#xff0c;最常见就是手机和电脑显示器…

图论1-问题 B: 算法7-4,7-5:图的遍历——深度优先搜索

题目描述 深度优先搜索遍历类似于树的先根遍历&#xff0c;是树的先根遍历的推广。其过程为&#xff1a;假设初始状态是图中所有顶点未曾被访问&#xff0c;则深度优先搜索可以从图中的某个顶点v出发&#xff0c;访问此顶点&#xff0c;然后依次从v的未被访问的邻接点出发深度优…