forked from p93542168/wheat-cache
52 lines
1004 B
Go
52 lines
1004 B
Go
package lru
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"gitee.com/timedb/wheatCache/pkg/proto"
|
|
"gitee.com/timedb/wheatCache/pkg/util/skiplist"
|
|
)
|
|
|
|
// lru 的 ttl 管理器
|
|
type lruTTl struct {
|
|
sk *skiplist.SkipList
|
|
memoryKey chan string // 缓存过期的 key
|
|
detachNum int // 每次移除的数量
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func (l *lruTTl) setKeys(key *proto.BaseKey) int64 {
|
|
l.mu.Lock()
|
|
defer l.mu.Unlock()
|
|
|
|
ttlTime := time.Now().Unix()
|
|
if key.Expire != nil {
|
|
ttlTime = key.Expire.GetSeconds()
|
|
}
|
|
|
|
ttlTime += key.GetTtl()
|
|
l.sk.Insert(float64(ttlTime), key.GetKey())
|
|
|
|
return ttlTime
|
|
}
|
|
|
|
// 加载过期的 Key 到 Memory
|
|
func (l *lruTTl) ttlKeyToMemoryBySecond() {
|
|
t := time.Now()
|
|
values := l.sk.PopLeft(float64(t.Unix()))
|
|
|
|
for _, val := range values {
|
|
l.memoryKey <- val.(string)
|
|
}
|
|
}
|
|
|
|
func newLruTTl(detachNum int) *lruTTl {
|
|
return &lruTTl{
|
|
sk: skiplist.NewSkipList(defaultTtlMaxLevel),
|
|
// 默认 10000 个 Key
|
|
memoryKey: make(chan string, 10000),
|
|
detachNum: detachNum,
|
|
}
|
|
}
|