[TOC] > [github](https://github.com/bluele/gcache) ## 概述 ### LRC 缓存资源通常比较昂贵,通常数据量较大时,会竟可能从较少的缓存满足尽可能多访问. 这里有一种假设,通常最近被访问的数据,那么它就有可能会被后续继续访问,基于这种假设,将所有的数据按访问时间进行排序,并按驱逐出旧数据,那么存在缓存的数据就为热点数据. 这样既节省了内存资源,又极大的满足了访问.LRU(Least recently used)算法就是基于这种假设的一直缓存置换算法. ### LFU LFU是最近**最不常用页面**置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页! ### 自适应缓存替换算法(ARC) 在IBM Almaden研究中心开发,这个缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用 ## 安装 `go get github.com/bluele/gcache` ## 实例 ### LRU ``` package main import ( "github.com/bluele/gcache" "fmt" ) func main() { gc := gcache.New(20). LRU(). Build() gc.Set("key", "ok") value, err := gc.Get("key") if err != nil { panic(err) } fmt.Println("Get:", value) } ``` ### LRU 带缓存时间 ``` gc := gcache.New(20). LRU(). Build() gc.SetWithExpire("key", "ok", time.Second*10) ``` ### LFU ``` func main() { // size: 10 gc := gcache.New(10). LFU(). Build() gc.Set("key", "value") } ``` ### 自适应替换缓存(ARC) 不断地在LRU和LFU之间保持平衡,以改善组合结果。 ``` func main() { // size: 10 gc := gcache.New(10). ARC(). Build() gc.Set("key", "value") } ``` ### 键值映射顺序移除 ``` func main() { // size: 10 gc := gcache.New(10).Build() gc.Set("key", "value") v, err := gc.Get("key") if err != nil { panic(err) } } ``` ### 在移除,添加时可加入监听函数 ``` gc := gcache.New(2). EvictedFunc(func(key, value interface{}) { fmt.Println("evicted key:", key) }). AddedFunc(func(key, value interface{}) { fmt.Println("added key:", key) }). Build() ```