mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2024-12-21 10:13:11 +00:00
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())
|
||
|
}
|