首页 > 系统相关 >go-cache基于内存的键值存储缓存库

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

时间:2024-01-29 20:12:40浏览次数:23  
标签:缓存 过期 cache Redis 键值 time go

Go的内存 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(10*time.Second, 30*time.Minute)

    // 设置过期时间
    caching.Set("k1", "v1", 10*time.Second)
   time.Sleep(5 * time.Second)
  // 获取数据 value, ok := caching.Get("k1") if !ok { fmt.Println("ok值为", ok) } fmt.Printf("k1对应的值是: %v\n", value) }

 示例2

import (
    "fmt"
    "time"

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

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

    // 设置过期时间
    caching.Set("k1", "v1", 10*time.Second)
    time.Sleep(15 * time.Second)
  // 获取数据 value, ok := caching.Get("k1") if !ok { fmt.Println("ok值为", ok) } fmt.Printf("k1对应的值是: %v\n", value) }

go-cache 使用注意点:
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 和 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。

标签:缓存,过期,cache,Redis,键值,time,go
From: https://www.cnblogs.com/beatle-go/p/17995233

相关文章

  • Django - admin 表单编辑页面,增加自定义功能,前端上传视频到oss
    #背景:可以在admin编辑页面原有基础上,增加一些可定制的功能,如:在本地上传图片到oss,减少服务器的带宽压力,下面就以此为例。示例图:  一。models.py#video可以直接用字符串存储,因为最终里面只有有一串oss的视频路径classNews(models.Model):OSS_URL='https://xxxx......
  • Django 中使用ModelForm生成HTML标签
    在Django中,使用ModelForm来生成HTML表单标签是一种常见且高效的做法。ModelForm可以自动根据模型的字段生成对应的表单字段,这大大简化了表单的创建和处理过程。以下是如何在Django中使用ModelForm来生成HTML标签的基本步骤:步骤1:创建ModelForm首先,你需要为你的模型......
  • Go语言:结构体
    Go语言提供了一种强大的数据结构:结构体(Struct),它是一种聚合数据类型,允许我们将多个不同类型的项(称为字段)组合成一个单一的复合类型。这使得结构体非常适合用来创建复杂的数据模型。本文将介绍Go语言中结构体的基本语法,并通过示例说明它们的使用方法。结构体的定义在Go中,结构体是通过......
  • 06django
    神奇的双下划线查询#1.查询年龄大于20的用户#res=models.User.objects.filter(age__gt=20)#print(res)"""__gt大于__lt小于__gte大于等于__lte小于等于"""#2.查询年龄是18、22、25的用户#res=models.......
  • java 两个mongo库数据迁移
    publicstaticvoidmain(String[]args){Stringcollectionname="test";//MongoDBURIStringuri="mongodb://用户名:密码@ip:端口/mydatabase?authSource=mongo";//Connecttothedatabaseusingtheprovi......
  • Golang学习--基础语法
    Golang学习Golang的优势极简单部署方式-可直接编译成机器码-不依赖其他库-直接运行即可部署静态类型语言-编译的时候能够检查出隐藏的大多数问题语言层面的并发-天生的基因支持-充分的利用多核强大的标准库-runtime系统调度机制-高效的GC垃圾回收-丰富的标准......
  • Gogs,支付宝沙箱支付,DevOps&CI/CD
    1.Gogs2.支付宝沙箱支付测试3.DevOps是生么4.CI/CD是什么1.Gogs是一款极易搭建的自助Git服务。Gogs的目标是打造一个最简单、最快速和最轻松的方式搭建自助Git服务。使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台,包括Linux、Ma......
  • 遗传算法(Genetic Algorithm)
    算法简介遗传算法(GeneticAlgorithm,GA)是一种基于自然选择和遗传操作的随机全局搜索优化算法。它通过模拟自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任一初始种群(父代)开始,通过随机选择、交叉和变异操作,产生更具有生存优势的子代,使群体不断向搜索空间最......
  • 使用Golang编写Windows服务
    主要是使用”github.com/kardianos/service“这个库它已经处理好了与服务管理器的交互细节,并且自带服务安装、卸载、启动、停止等功能,非常齐全了。直接上完整代码:packagemainimport( "log" "os" "syscall" "time" "unsafe" "github.com/kardianos/service")......
  • Go语言的100个错误使用场景(一)|代码和项目组织
    目录前言1.Go:Simpletolearnbuthardtomaster1.1Go语言概述1.2简单不等于容易1.3使用Go的100个错误2.Codeandprojectorganization2.1变量屏蔽(#1)2.2没有必要的代码嵌套(#2)2.3误用init函数(#3)2.4过度使用getter&setter(#4)2.5接口污染(#5)2.6在生产侧的接口(#6......