• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 娅水9213 | 发布时间: 2025-8-14 08:24| 查看数: 90| 评论数: 0|帖子模式

    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/

    安装
    1. go get github.com/patrickmn/go-cache
    复制代码
    方法
    1. func New(defaultExpiration, cleanupInterval time.Duration) *Cache

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

    3. func (c *cache) Get(k string) (interface{}, bool)
    复制代码
    示例1
    1. import (
    2.     "fmt"
    3.     "time"

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

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

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

    14.     if !ok {
    15.         fmt.Println("ok值为", ok)
    16.     }
    17.     fmt.Printf("k1对应的值是: %v\n", value)
    18. }
    复制代码


    示例2
    1. import (
    2.     "fmt"
    3.     "time"

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

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

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

    14.     if !ok {
    15.         fmt.Println("ok值为", ok)
    16.     }
    17.     fmt.Printf("k1对应的值是: %v\n", value)
    18. }
    复制代码


    使用注意点

    1)尽量存放那些相对不怎么变化的数据, 适用于所有的 local cache(包括 map, sync.map)
    2)go-cache 的过期检查时间要设置相对较小, 也不能过小
    3)那些高 QPS 的接口尽量不要去直接 Set 数据, 如果必须 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 和 AOF 两种方式,可以保证数据不会因服务器重启或宕机而丢失。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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表