diff --git a/internal/caches/list_file.go b/internal/caches/list_file.go index 518cb77..d828e74 100644 --- a/internal/caches/list_file.go +++ b/internal/caches/list_file.go @@ -206,6 +206,10 @@ func (this *FileList) CleanPrefix(prefix string) error { return nil } + defer func() { + this.memoryCache.Clean() + }() + var count = int64(10000) for { result, err := this.db.Exec(`UPDATE "`+this.itemsTableName+`" SET expiredAt=0 WHERE id IN (SELECT id FROM "`+this.itemsTableName+`" WHERE expiredAt>0 AND createdAt<=? AND INSTR("key", ?)=1 LIMIT `+strconv.FormatInt(count, 10)+`)`, utils.UnixTime(), prefix) diff --git a/internal/nodes/api_stream.go b/internal/nodes/api_stream.go index 73f08e3..cc0b08f 100644 --- a/internal/nodes/api_stream.go +++ b/internal/nodes/api_stream.go @@ -2,6 +2,7 @@ package nodes import ( "context" + "crypto/tls" "encoding/json" "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/messageconfigs" @@ -16,6 +17,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/iwind/TeaGo/logs" "io" + "net" "net/http" "os/exec" "strconv" @@ -367,7 +369,28 @@ func (this *APIStream) handlePreheatCache(message *pb.NodeStreamMessage) error { wg := sync.WaitGroup{} wg.Add(len(msg.Keys)) - client := http.Client{} // TODO 可以设置请求超时事件 + client := &http.Client{ + Timeout: 30 * time.Second, // TODO 可以设置请求超时时间 + Transport: &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + _, port, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + return net.Dial(network, "127.0.0.1:"+port) + }, + MaxIdleConns: 4096, + MaxIdleConnsPerHost: 32, + MaxConnsPerHost: 32, + IdleConnTimeout: 2 * time.Minute, + ExpectContinueTimeout: 1 * time.Second, + TLSHandshakeTimeout: 0, + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, + } + defer client.CloseIdleConnections() errorMessages := []string{} locker := sync.Mutex{} for _, key := range msg.Keys { @@ -381,7 +404,9 @@ func (this *APIStream) handlePreheatCache(message *pb.NodeStreamMessage) error { locker.Unlock() return } + // TODO 可以在管理界面自定义Header + req.Header.Set("X-Cache-Action", "preheat") req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36") req.Header.Set("Accept-Encoding", "gzip, deflate, br") // TODO 这里需要记录下缓存是否为gzip的 resp, err := client.Do(req) diff --git a/internal/nodes/http_request_cache.go b/internal/nodes/http_request_cache.go index 6c6e280..8b78fae 100644 --- a/internal/nodes/http_request_cache.go +++ b/internal/nodes/http_request_cache.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "net/http" "strconv" + "strings" "time" ) @@ -20,6 +21,12 @@ func (this *HTTPRequest) doCacheRead() (shouldStop bool) { if this.web.Cache == nil || !this.web.Cache.IsOn || (len(cachePolicy.CacheRefs) == 0 && len(this.web.Cache.CacheRefs) == 0) { return } + + // 判断是否在预热 + if strings.HasPrefix(this.RawReq.RemoteAddr, "127.") && this.RawReq.Header.Get("X-Cache-Action") == "preheat" { + return + } + var addStatusHeader = this.web.Cache.AddStatusHeader if addStatusHeader { defer func() {