Gcache 带过期,带操作事件,支持 LFU,LRU ,ARC
最后更新于:2022-04-02 02:38:10
[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()
```
';