xcahe
是一个提供单机缓存池的第三方库,淘汰机制采用LRU(Least recently used,最近最少使用)。
- 单机缓存适用场景较为局限,必须可容忍数据不一致。
- 虽然提供监视者
monitor
功能可定时消除脏数据,但定时器间隔期间读取同样会产生误差,即遵循上条规则。
- 提供默认单机缓存池,最大容量为1000,监控间隔为10s。
- 提供自定义缓存容量,到达容量则使用LRU算法淘汰。
- 容量到达最大值执行淘汰机制(LRU)。
- 提供监视者
monitor
开关及自定义间隔,监视者在定时器间隔gap
会执行用户提供的数据源方法,返回值为nil时删除单机缓存中脏数据。 - 用户打开监视者
monitor
后可自主向监视者提供"犯人"prisoner
或者移除"犯人"prisoner
,此过程是并发安全的。
go get -u github.com/sugtex/xcache
xcache.Add("a",[]byte("x"))
type GetF func(context.Context) ([]byte, error)
func getData(ctx context.Context)(reply []byte,err error){
// 获取数据源逻辑
return
}
参数:ctx(上下文),键(key),getF(获取数据源方法)
reply,err:=xcache.Get(context.Background(),"a",getData)
if err!=nil{
// 处理异常
return
}
xcache.Del("a")
"犯人"由key(键)和getF(获取数据源方法)构成
xcache.WithPrisoner("a",getData)
xcache.AddPrisoner(xcache.WithPrisoner("a",getData))
xcache.RemovePrisoner(xcache.WithPrisoner("a",getData))
cache:=xcache.NewXCache(10)
cache:=xcache.NewXCache(10,xcache.WithOpenMonitor(20))
if ok := cache.ResetMonitor(30); ok {
// 处理参数错误逻辑
return
}
- LRU算法"增删改查"时间复杂度均为O(1),算法来源
LeetCode
146题或16.25题,进阶。 - 146题:
https://leetcode-cn.com/problems/lru-cache/
- 16.25题:
https://leetcode-cn.com/problems/lru-cache-lcci/