3.go开源cache2go项目笔记——cachetable文件
该文件是项目中行数最多的go文件。共338行。
"log"
"sort"
"sync"
"time"
结构定义如下:
type CacheTable struct {
sync.RWMutex
namestring
itemsmap[interface{}]*CacheItem
cleanupTimer*time.Timer
cleanupIntervaltime.Duration
logger*log.Logger
loadDatafunc(key interface{}, args ...interface{}) *CacheItem
addedItemfunc(item *CacheItem)
aboutToDeleteItemfunc(item *CacheItem)
}
sync.Mutex 是一个互斥锁,它的作用是守护在临界区入口来确保同一时间只能有一个线程进入临界区。golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能
name是表名字
items是所有缓存的目录,是一个MAP结构,存的是CACHEITEM指针
cleanupTimer是清除缓存的定时器
cleanupInterval当前定时器已过去的时间
logger 表的日志记录记录句柄
loadData是加载不存在键时回调的函数
addedItem是增加新ITEM的回调函数
aboutToDeleteItem是从CACHE中删除ITEM前调用的函数
Key 变量键值是interface
AccessCount 访问计数
定义CacheItemPairList为CacheItemPair数组。
交换两个CACHEITEM
返回CACHE ITEM数量。
比较两个ITEM访问的次数。
调用len函数返回item数量。
遍历所有ITEMS
打印日志。内部日志函数。
设置loadData函数句柄。
设置addedItem函数,每次有新的ITEM加入到缓存的时候调用。
设置aboutToDeleteItem函数,每次有ITEM从缓存中删除的时候调用。
设置logger函数。
检查是否过期
向表中增加item.
从表中删除ITEM。
判断是否存在于表中。
如果没有找到,就调用addedItem来创建item.
从缓存中获取ITEM,并调用keepalive.
清除CACHE中的ITEM。
如果清除定时器不为nil,则停止定时器。
例如删除ITEM时候回调函数aboutToDeleteItem。
在删除ITEM的函数即Delete函数(cachetble.go)中使用了
aboutToDeleteItem :=table.aboutToDeleteItem将全局变量赋值,如果不是NIL则进行调用之来实现回调。