47 lines
937 B
Go
47 lines
937 B
Go
package ttlcache
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// ItemNotExpire Will avoid the item being expired by TTL, but can still be exired by callback etc.
|
|
ItemNotExpire time.Duration = -1
|
|
// ItemExpireWithGlobalTTL will use the global TTL when set.
|
|
ItemExpireWithGlobalTTL time.Duration = 0
|
|
)
|
|
|
|
func newItem(key string, data interface{}, ttl time.Duration) *item {
|
|
item := &item{
|
|
data: data,
|
|
ttl: ttl,
|
|
key: key,
|
|
}
|
|
// since nobody is aware yet of this item, it's safe to touch without lock here
|
|
item.touch()
|
|
return item
|
|
}
|
|
|
|
type item struct {
|
|
key string
|
|
data interface{}
|
|
ttl time.Duration
|
|
expireAt time.Time
|
|
queueIndex int
|
|
}
|
|
|
|
// Reset the item expiration time
|
|
func (item *item) touch() {
|
|
if item.ttl > 0 {
|
|
item.expireAt = time.Now().Add(item.ttl)
|
|
}
|
|
}
|
|
|
|
// Verify if the item is expired
|
|
func (item *item) expired() bool {
|
|
if item.ttl <= 0 {
|
|
return false
|
|
}
|
|
return item.expireAt.Before(time.Now())
|
|
}
|