116 lines
2.3 KiB
Go
116 lines
2.3 KiB
Go
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
|
|
}
|