go-cache的基本使用场景示例解析

 更新时间:2023年04月23日 14:30:26   作者:LiP  
这篇文章主要为大家介绍了go-cache的基本使用场景示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是 go-cache

go-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 map[string]interface{},适用于单机应用。具备如下功能:

  • 线程安全,多 goroutine 并发安全访问;
  • 每个 item 可以设置过期时间(或无过期时间);
  • 自动定期清理过期的 item;
  • 可以自定义清理回调函数;

这里的 item 指的是 map 里的元素。

go-cache 一般用作临时数据缓存来使用,而不是持久性的数据存储。对于某些停机后快速恢复的场景,go-cache支持将缓存数据保存到文件,恢复时从文件中将数据加载到内存。

使用

导入

github.com/patrickmn/go-cache

快速开始

c := cache.New(10*time.Second, 30*time.Second) 
// 默认过期时间10s;清理间隔30s,即每30s会自动清理过期的键值对  

// 设置一个键值对,过期时间是 3s 
c.Set("a", "testa", 3*time.Second)  

// 设置一个键值对,采用 New() 时的默认过期时间,即 10s 
c.Set("foo", "bar", cache.DefaultExpiration)  

// 设置一个键值对,没有过期时间,不会自动过期,需要手动调用 Delete() 才能删除 
c.Set("baz", 42, cache.NoExpiration)  

v, found := c.Get("a") 
fmt.Println(v, found) // testa,true  

<-time.After(5 * time.Second) // 延时5s 

v, found = c.Get("a") // nil,false  
fmt.Println(v, found)  

<-time.After(6 * time.Second) 

v, found = c.Get("foo") // nil,false  
fmt.Println(v, found) 

v, found = c.Get("baz") // 42,true  
fmt.Println(v, found)  

常量与结构体

常量

const (
    NoExpiration time.Duration = -1    // 无有效时间
    DefaultExpiration time.Duration = 0   // 表示采用默认时间
)

这两个参数可以用作 New() 函数的第一个入参,则默认过期时间小于0,意味着添加键值对时如果采用默认过期时间,则该键值对不会过期,因为 DeleteExpired() 方法会判断 v.Expiration 是否大于 0,大于 0 时才会自动删除。如果想删除需要手动 Delete() 方法。

添加键值对,比如执行 Set()、Add() 等操作时,这两个常量也可以作为参数,NoExpiration 表示没有过期时间,DefaultExpiration 表示采用默认的过期时间。

结构体

主要的结构体包括下面这些:

type Item struct {  // 键值对
 Object     interface{}     // 存放 K-V 的值,可以存放任何类型的值
 Expiration int64   // 键值对的过期时间(绝对时间)
}

type Cache struct {   // 对外使用的 Cache
 *cache  // cache 实例
}

type cache struct {
 defaultExpiration time.Duration   // 默认的过期时间,添加一个键值对时如果设置默认的过期时间(即代码里的 DefaultExpiration)则会使用到该值
 items             map[string]Item   // 存放的键值对
 mu                sync.RWMutex   // 读写锁
 onEvicted         func(string, interface{})  // 删除key时的回调函数
 janitor           *janitor  // 定期清理器 定期检查过期的 Item
}

type janitor struct { // 清理器结构体
 Interval time.Duration // 清理时间间隔
 stop     chan bool     // 是否停止
}

Set()

Set()配置key/value对,并附上过期时间。有两个类似的方法Add()和replace()。

区别是,Set()不管key是否存在,都配置。Add()只能用于key不存在的情况,否则报错,replace是反的,只能用于key存在的情况,否则报错。

Get()

获取key/value对,并返回是key是否存在且未过期。GetWithExpiration()相较Get()方法多了个返回过期时间的参数。

删除

删除操作主要有两个,执行删除操作的时候都会判断是否需要执行删除回调函数。

Delete() 常规删除,不管是否过期都会删除。

DeleteExpired() 用于执行批量删除操作,只会删除已过期的键值对。

其他

  • ItemCount(),返回所有数据的条数,这里的条数包括已过期但还未被删除的数量;
  • Flush(),清空数据;
  • Items(),返回数据的未过期的数据,可以使用 NewFrom() 恢复数据;

备份恢复数据

虽然 go-cache 比较倾向于当做缓存数据来使用,但还是提供了备份数据和恢复数据的操作,数据使用 gob 序列化。

以上就是go-cache的基本使用场景示例解析的详细内容,更多关于go-cache使用场景示例的资料请关注脚本之家其它相关文章!

相关文章

  • Go单元测试对数据库CRUD进行Mock测试

    Go单元测试对数据库CRUD进行Mock测试

    这篇文章主要为大家介绍了Go单元测试对数据库CRUD进行Mock测试的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 手把手带你走进Go语言之常量解析

    手把手带你走进Go语言之常量解析

    这篇文章主要介绍了Go语言之常量解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • golang实战之truncate日志文件详解

    golang实战之truncate日志文件详解

    这篇文章主要给大家介绍了关于golang实战之truncate日志文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Go语言对JSON数据进行序列化和反序列化

    Go语言对JSON数据进行序列化和反序列化

    这篇文章介绍了Go语言对JSON数据进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • GoFrame 框架缓存查询结果的示例详解

    GoFrame 框架缓存查询结果的示例详解

    GoFrame的gdb对查询结果的缓存处理是不是非常的优雅。尤其是*gcache.Cache对象采用了适配器设计模式,可以轻松实现从单进程内存缓存切换为分布式的Redis缓存,本文重点给大家介绍GoFrame 如何优雅的缓存查询结果,感兴趣的朋友一起看看吧
    2022-06-06
  • go语言实现顺序存储的栈

    go语言实现顺序存储的栈

    这篇文章主要介绍了go语言实现顺序存储的栈,实例分析了Go语言实现顺序存储的栈的原理与各种常见的操作技巧,需要的朋友可以参考下
    2015-03-03
  • Go Slice进行参数传递如何实现详解

    Go Slice进行参数传递如何实现详解

    这篇文章主要为大家介绍了Go Slice进行参数传递如何实现的过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang 如何获取pem格式RSA公私钥长度

    golang 如何获取pem格式RSA公私钥长度

    这篇文章主要介绍了golang 如何获取pem格式RSA公私钥长度操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解使用Go添加Nginx代理的方法示例

    详解使用Go添加Nginx代理的方法示例

    这篇文章主要介绍了详解使用Go添加Nginx代理的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 浅谈Go语言的空标示符

    浅谈Go语言的空标示符

    本文通过文字及实例介绍了Go语言的空标示符,对此有不明白的朋友可以参考学习,下面一起来看看吧。
    2016-08-08

最新评论