Golang基于内存的键值存储缓存库go-cache

2025-03-04 17:50

本文主要是介绍Golang基于内存的键值存储缓存库go-cache,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库...

go-cache是一种内存中的key:value store/cache库,类似于Memcached,适用于在一台机器上运行的应用程序(单机应用程序)。

文档

https://pkg.go.dev/github.com/patrickmn/go-cache
https://github.com/patrickmn/go-cache
https://patrickmn.com/projects/go-cache/

安装

go get github.com/patrickmn/go-cache

方法

func New(defaultExpiration, cleanupInterval time.Duration) *Cache

func (c *cache) Set(k string, x interface{}, d time.Duration)

func (c *cache) Get(k string) (interface{}, bool)

示例1

import (
    "fmt"
    "time"

    "github.com/patrickmn/go-cache"
)

func main() {
    // 设置默认过期时间10秒;清理间隔30分钟
    caching := cache.New(<strong>10*time.Second</strong>, 30*time.Minute)

    // 设置过期时间
    caching.Set("k1", "v1", 10*time.Second)
   <strong>time.Sleep(</strong><strong>5 China编程* time.Second)
</strong>  // 获取数据
    value, ok := caching.Get("k1")

    if !ok {
     php   fmt.Println("ok值为", ok)
    }
    fmt.Printf("k1对应的值是: %v\n", value)
}

Golang基于内存的键值存储缓存库go-cache

示例2

import (
    "fmt"
    "time"

    "github.com/patrickmn/go-cache"
)

func main() {
    // 设置默认过期时间10秒;清理间隔30分钟
    caching := cache.New(<strong>10*time.Second</strong>, 30*time.Minute)

    // 设置过期时间
    caching.Set("k1", "v1", 10*time.Second)
    <strong>time.Sleep(</strong><strong>15 * time.Second)
</strong>  // 获取数据
    value, ok := caching.Get("k1")

    if !ok {
        fmt.Println("ok值为", ok)
    }
    fmt.Printf("k1对应的值是: %v\n", value)
}

Golang基于内存的键值存储缓存库go-cache

使用注意点

1)尽量存放那些相对不怎么变化的数据, 适用于所有的 local cache(包括 map, sync.map)

2)go-cache 的过期检查时China编程间要设置相对较小, 也不能过小

3)那些高 QPS 的接口尽量不要去直接 Set 数据, 如果必须China编程 Set 可以采用异步操作

4)监控 go-cache 里面 key 的数量, 如果过多时, 需要及时调整参数

优点

(主要优点:本质上是一个具有过期时间的线程安全的 map[string]interface{},它不需要序列化或通过网络传输其内容)

1)简单易用,适合快速集成到现有项目中;
2)支持过期时间,可以自动淘汰过期的缓存项;
3)支持多种数据类型的缓存;

缺点

1)性能略低于其他库,不适合高并发读写的场景;
2)不支持分布式缓存。

注意

go-cache是一个内存缓存库,它主要用于单进程内的缓存操作。这意味着如果在服务 A 中设置了某个键值对,服务 B 无法直接访问服务 A 的缓存实例,因为它们是独立的进程,每个进程都有自己的缓存实例。
如果希望在多个服务之间共享缓存数据,需要使用一个分布式的缓存解决方案,例如 Redis、Memcached 或其他支持分布式缓存的系统。这些系统可以在多个服务之间共享数据,并且支持跨服务的数据一致性。

go-cache 和 redis 缓存对比

1)功能特性:

Go Cache 是一个 Go 语言的内存缓存库,使用起来非常简单,适合处理轻量级缓存需求。它提供了基本的 Get、Set、Delete 等缓存操作接口,并支持缓存过期时间和自动清理过期缓存。但是,它只能存储在内存中,无法持久化到磁盘,不适用于大规模数据和高并发场景。

Redis 是一个基于内存的高性能键值存储系统,支持多种数据结构、高并发访问和持久化等功能。Redis 除了支持基本的 Get、Set、Delete 等操作外,还支持多种高级特性,如发布/订阅、事务、Lua 脚本等。Redis 的持久化机制包括 RDB 和 AandroidOF 两种方式,可以保证数据不会因服务器重启或宕机而丢失。Redis 还支持分布式架构,可以通过主从复制和集群等方式进行数据分片和高可用性保障。

2)性能表现:

由于 Go Cache 是一个纯内存缓存,因此在处理轻量级数据时,性能较为优秀,适合处理小规模数据和短期存储需求。

Redis 的性能则相对更为出色,尤其是在处理大规模数据和高并发访问时,Redis 的性能表现更为卓越。Redis 的数据结构支持多种类型,包括字符串、列表、哈希、集合和有序集合等,可以满足不同应用场景的需求。

3)适用场景:

Go Cache 适用于轻量级的应用场景,比如 Web 应用中的页面片段、会话信息等短期存储数据。

Redis 则适用于更加复杂的应用场景,比如高并发的 Web 应用、数据分析、实时计算、消息队列等。

综上所述,Go Cache 和 Redis 都是优秀的缓存解决方案,但是它们的功能特性、性能表现和适用场景略有不同。如果应用场景是轻量级的、短期存储的数据,可以选择 Go Cache;如果需要处理大规模的、高并发访问的数据,可以选择 Redis。

到此这篇关于golang基于内存的键值存储缓存库 go-cache的文章就介绍到这了,更多相关Golang缓存库 go-cache内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Golang基于内存的键值存储缓存库go-cache的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153639

相关文章

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接