package cache2go import ( "sync" "time" ) // CacheItem 单独的缓存项 type CacheItem struct { sync.RWMutex // key 缓存项 键 key any // data 缓存项 值 data any // lifeSpan 缓存时长 lifeSpan time.Duration // createdOn 创建时间 createdOn time.Time // accessedOn 上次访问时间 accessedOn time.Time // accessCount 访问项目的频率 accessCount int64 // aboutToExpire 在从缓存中删除项之前立即触发回调方法 aboutToExpire []func(key any) } // NewCacheItem 新建一个缓存项 func NewCacheItem(key any, data any, lifeSpan time.Duration) *CacheItem { t := time.Now() return &CacheItem{ key: key, data: data, lifeSpan: lifeSpan, createdOn: t, accessedOn: t, accessCount: 0, aboutToExpire: nil, } } // keepAlive 标记访问的项 func (item *CacheItem) KeepAlive() { item.Lock() defer item.Unlock() item.accessedOn = time.Now() item.accessCount++ } // LifeSpan 返回缓存项的缓存时长 func (item *CacheItem) LifeSpan() time.Duration { return item.lifeSpan } // AccessedOn 返回缓存项最后一次访问时间 func (item *CacheItem) AccessedOn() time.Time { item.RLock() defer item.RUnlock() return item.accessedOn } // AccessedOn 返回缓存项访问次数 func (item *CacheItem) AccessedCount() int64 { item.RLock() defer item.RUnlock() return item.accessCount } // CreatedOn 返回缓存项添加时间 func (item *CacheItem) CreatedOn() time.Time { return item.createdOn } // Key 返回缓存项的键 func (item *CacheItem) Key() any { return item.key } // Data 返回缓存项的值 func (item *CacheItem) Data() any { return item.data } // SetAboutToExpireCallback 设置回调 在缓存项删除之前调用 func (item *CacheItem) SetAboutToExpireCallback(f func(any)) { if len(item.aboutToExpire) > 0 { item.ClearAboutToExpireCallback() } item.Lock() defer item.Unlock() item.aboutToExpire = append(item.aboutToExpire, f) } // AddAboutToExpireCallback 将一个新的回调追加到AboutToExpire队列 func (item *CacheItem) AddAboutToExpireCallback(f func(any)) { item.Lock() defer item.Unlock() item.aboutToExpire = append(item.aboutToExpire, f) } // ClearAboutToExpireCallback 清空即将过期的回调队列 func (item *CacheItem) ClearAboutToExpireCallback() { item.Lock() defer item.Unlock() item.aboutToExpire = nil }