mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-05 01:20:26 +08:00
自动为热点数据设置合适的过期时间
This commit is contained in:
@@ -3,8 +3,6 @@
|
|||||||
package caches
|
package caches
|
||||||
|
|
||||||
type HotItem struct {
|
type HotItem struct {
|
||||||
Key string
|
Key string
|
||||||
ExpiresAt int64
|
Hits uint32
|
||||||
Hits uint32
|
|
||||||
Status int
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ const (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
HotItemSize = 1024 // 热点数据数量
|
HotItemSize = 1024 // 热点数据数量
|
||||||
|
HotItemLifeSeconds int64 = 3600 // 热点数据生命周期
|
||||||
FileToMemoryMaxSize int64 = 32 * sizes.M // 可以从文件写入到内存的最大文件尺寸
|
FileToMemoryMaxSize int64 = 32 * sizes.M // 可以从文件写入到内存的最大文件尺寸
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -947,11 +948,26 @@ func (this *FileStorage) hotLoop() {
|
|||||||
if reader == nil {
|
if reader == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if reader.ExpiresAt() <= time.Now().Unix() {
|
|
||||||
|
// 如果即将过期,则忽略
|
||||||
|
var nowUnixTime = time.Now().Unix()
|
||||||
|
if reader.ExpiresAt() <= nowUnixTime+600 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
writer, err := this.memoryStorage.openWriter(item.Key, item.ExpiresAt, item.Status, reader.BodySize(), -1, false)
|
// 计算合适的过期时间
|
||||||
|
var bestExpiresAt = nowUnixTime + HotItemLifeSeconds
|
||||||
|
var hotTimes = int64(item.Hits) / 1000
|
||||||
|
if hotTimes > 8 {
|
||||||
|
hotTimes = 8
|
||||||
|
}
|
||||||
|
bestExpiresAt += hotTimes * HotItemLifeSeconds
|
||||||
|
var expiresAt = reader.ExpiresAt()
|
||||||
|
if expiresAt <= 0 || expiresAt > bestExpiresAt {
|
||||||
|
expiresAt = bestExpiresAt
|
||||||
|
}
|
||||||
|
|
||||||
|
writer, err := this.memoryStorage.openWriter(item.Key, expiresAt, reader.Status(), reader.BodySize(), -1, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !CanIgnoreErr(err) {
|
if !CanIgnoreErr(err) {
|
||||||
remotelogs.Error("CACHE", "transfer hot item failed: "+err.Error())
|
remotelogs.Error("CACHE", "transfer hot item failed: "+err.Error())
|
||||||
@@ -990,7 +1006,7 @@ func (this *FileStorage) hotLoop() {
|
|||||||
this.memoryStorage.AddToList(&Item{
|
this.memoryStorage.AddToList(&Item{
|
||||||
Type: writer.ItemType(),
|
Type: writer.ItemType(),
|
||||||
Key: item.Key,
|
Key: item.Key,
|
||||||
ExpiredAt: item.ExpiresAt,
|
ExpiredAt: expiresAt,
|
||||||
HeaderSize: writer.HeaderSize(),
|
HeaderSize: writer.HeaderSize(),
|
||||||
BodySize: writer.BodySize(),
|
BodySize: writer.BodySize(),
|
||||||
})
|
})
|
||||||
@@ -1065,15 +1081,20 @@ func (this *FileStorage) increaseHit(key string, hash string, reader Reader) {
|
|||||||
if this.memoryStorage != nil && reader.BodySize() > 0 && reader.BodySize() < 128*1024*1024 {
|
if this.memoryStorage != nil && reader.BodySize() > 0 && reader.BodySize() < 128*1024*1024 {
|
||||||
this.hotMapLocker.Lock()
|
this.hotMapLocker.Lock()
|
||||||
hotItem, ok := this.hotMap[key]
|
hotItem, ok := this.hotMap[key]
|
||||||
|
|
||||||
|
// 限制热点数据存活时间
|
||||||
|
var unixTime = time.Now().Unix()
|
||||||
|
var expiresAt = reader.ExpiresAt()
|
||||||
|
if expiresAt <= 0 || expiresAt > unixTime+HotItemLifeSeconds {
|
||||||
|
expiresAt = unixTime + HotItemLifeSeconds
|
||||||
|
}
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
hotItem.Hits++
|
hotItem.Hits++
|
||||||
hotItem.ExpiresAt = reader.ExpiresAt()
|
|
||||||
} else if len(this.hotMap) < HotItemSize { // 控制数量
|
} else if len(this.hotMap) < HotItemSize { // 控制数量
|
||||||
this.hotMap[key] = &HotItem{
|
this.hotMap[key] = &HotItem{
|
||||||
Key: key,
|
Key: key,
|
||||||
ExpiresAt: reader.ExpiresAt(),
|
Hits: 1,
|
||||||
Status: reader.Status(),
|
|
||||||
Hits: 1,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.hotMapLocker.Unlock()
|
this.hotMapLocker.Unlock()
|
||||||
|
|||||||
Reference in New Issue
Block a user