go-cache是什么以及应用场景 go-cache 是一个类似Memcached的go库,key:value存储在内存中。适合单机应用调用。 https://github.com/patrickmn/go-cache 使用 import ( "fmt" "github.com/patrickmn/go-cache" "time" ) associated with the key "foo" from the cache foo, found := c.Get("foo") if found { fmt.Println(foo) } } go-cache sync.RWMutex onEvicted func(string, interface{}) janitor *janitor } go-cache
github.com/patrickmn/go-cache是知名golang local cache实现里面最简单的一种,可以理解为就是简单的map加锁实现的,它通过定时器来进行过期key 首先看下如何使用它 package main import ( "fmt" "time" "github.com/patrickmn/go-cache" ) func main() {
go-cache 是一个 golang 的缓存库, 用于缓存 k, v 对, 缓存时间过期后存储的值会失效, 底层是一个 map, 过期后内部 Item 是不会自动清除, 需要手动调用DeleteExpired 方法清除过期项 安装 go get github.com/patrickmn/go-cache 使用方法 // 创建Cache对象, 第一个参数为缓存时间, 第二个参数为清理缓存项的时间间隔 // 底层是一个 使用 gin 框架 package main import ( "fmt" "time" "github.com/gin-gonic/gin" "github.com/patrickmn/go-cache c.mu.Unlock() } 设置写锁,防止多个 goroutine 同时修改一个 item, 然后设置过期时间 这就是 go-cache 库, 主要用于单机缓存,底层是一个 map, 使用RWMutex
go-cache https://github.com/patrickmn/go-cache 一句话描述 基于内存的 K/V 存储/缓存 : (类似于Memcached),适用于单机应用程序 简介 go-cache 基于内存的 K/V 存储/缓存 : (类似于Memcached),适用于单机应用程序 ,支持删除,过期,默认Cache共享锁, 大量key的情况下会造成锁竞争严重 为什么选择go-cache? Example package main import ( "fmt" "time" "github.com/patrickmn/go-cache" ) type MyStruct struct } c.mu.Unlock() for _, v := range evictedItems { c.onEvicted(v.key, v.value) } } 思考 Lock 的使用 在go-cache Doc http://godoc.org/github.com/patrickmn/go-cache 比较 相似的库 https://github.com/golang/groupcache https
这里的 v2.1.0 是因为引用的 go-cache 包在 github 上已经打标签了,所以有 v2.1.0 类似的字样出现,后面有 incompatible 是因为 go-cache 包的命名没有遵循官方规范 此时我们需要手动修改 gomod 引用包的版本名字,替换为对应的分支名,比如 gomod 文件改为: require github.com/patrickmn/go-cache develop 然后再使用 执行结果: github.com/patrickmn/go-cache v1.0.0 v2.0.0+incompatible v2.1.0+incompatible 然后当我们想引用 v1.0.0 时 ,就可以这样改写了: require github.com/patrickmn/go-cache v1.0.0 需要注意的是,go list某个包,必须得先在此项目中引用了对应的包。 例如,当前项目如果没有引用 go-cache 包,则go list是获取不到信息的。
golang中使用go-cache是非常普遍的,比如,我在对接微信客服接口的时候,获取access_token,默认获取一次有两个小时的有效期 这个时候,我就可以使用go-cache来缓存access_token 了 下面是对go-cache的测试用例: package tools import ( "testing" "time" "github.com/patrickmn/go-cache
内存 (go-cache) (patrickmn/go-cache)。 内存缓存(bradfitz/memcache)。 Redis (go-redis/redis)。 如何使用 安装 要开始使用最新版本的 go-cache,您可以使用以下命令: go get github.com/eko/gocache/v3 为避免尝试导入库时出现任何错误,请使用以下导入语句: import
go-cache ⭐️⭐️⭐️ https://github.com/patrickmn/go-cache 是一个类似于 Java 中的 Guava cache,线程安全,使用简单;不需要分布式缓存的简单场景可以考虑 Excel相关需求 ⭐️⭐️⭐️⭐️⭐️ now 业务开发 时间处理 ⭐️⭐️⭐️⭐️️ Decimal 业务开发 精度处理 ⭐️⭐️⭐️⭐️️ configor 业务开发 配置文件 ⭐️⭐️⭐️⭐️️ go-cache
go-workspace 设置环境变量: 变量名 值 GOPATH F:\go-workspace 可选环境变量设置: 变量名 值 GOPROXY https://goproxy.io GOCACHE F:\go-cache
"bytes" "encoding/json" "encoding/xml" "errors" "fmt" "github.com/patrickmn/go-cache
开源的本地缓存库中 bigcache、go-cache、freecache都实现了分片功能,bigcache的hash选择的是fnv64a算法、go-cache的hash选择的是djb2算法、freechache
return fd.fakeNetFD.Close() } runtime.SetFinalizer(fd, nil) return fd.pfd.Close() } go-cache
maxBytes: maxBytes, usedBytes: 0, }, }}测试一下,编写测试类 cache_test.go :import ( "Go-Cache import ( "Go-Cache/00_fifo/character05" "net/http") type Server struct { cache character05 h.cache.Del(key) return } w.WriteHeader(http.StatusMethodNotAllowed) }启动类如下:import ( "Go-Cache /00_fifo/character05" "Go-Cache/00_fifo/character05/server") func main() { c := character05
KisFlow也提供流式计算中的共享缓存,采用简单的本地缓存供开发者按需使用,有关本地缓存的第三方技术依赖选型: https://github.com/patrickmn/go-cache8.1.1 go-cache (1)安装go get github.com/patrickmn/go-cache(2)使用import ("fmt""github.com/patrickmn/go-cache""time")func (*MyStruct)// ...}}详细参考:https://github.com/patrickmn/go-cache8.1.2 KisFlow集成go-cache能力(1) Flow提供抽象层接口在
比如 Golang 优秀的本地缓存组件 bigcache 、go-cache、freecache 都实现了分片功能,每个分片一把锁,采用分片存储的方式减少加锁的次数从而提高整体性能。
NewBigObject(data) globalCache[data] = obj // 导致对象无法回收}// 正确做法:使用弱引用或定期清理import "github.com/patrickmn/go-cache"var
eth_call去以太坊获取它们的地址,以及启动了定时任务同步本地区块数目,仅数目 n.registerUserManager() // lgh: 初始化用户白名单相关操作,内存缓存部分基于 go-cache 在registerMysql 做了表格的创建等工作 内存存储方面有两套 基于 Redis 基于 go-cache 库 在导入代币信息,和市值信息的部分存在一个问题点:配置文件中的市场市值数据获取的第三方接口
项目地址 https://github.com/patrickmn/go-cache 学习总结 Go Cache 算是比较常用的本地缓存工具。他结构清晰,操作简单,非常实用。
对于 Go 语言来讲,例如 go-cache 和 bigcache 、ristretto 。但这些都不是今天的重点,今天我们将手写一个 ==Go 本地 LRU 缓存== ,下面即将开始探险之旅。
《一次错误使用 go-cache 导致出现的线上问题》就是我真是遇到的一次线上问题,表象就是接口大量超时,打开pprof 发现大量 Goroutine 都集中 Lock 上。