cache2go/cache_item.go
2024-03-18 16:42:26 +08:00

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
}