From 57247d0f5b1222a86f1c05a41ba27405c711483c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Wed, 23 Mar 2022 10:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BF=E9=97=AE=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8F=AF=E8=83=BD=E6=97=A0=E6=B3=95=E5=86=99=E5=85=A5?= =?UTF-8?q?=E5=BD=93=E5=A4=A9=E6=95=B0=E6=8D=AE=E8=A1=A8=E7=9A=84Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/http_access_log_dao.go | 4 +-- internal/db/models/http_access_log_manager.go | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/internal/db/models/http_access_log_dao.go b/internal/db/models/http_access_log_dao.go index d2471f97..dee1bdac 100644 --- a/internal/db/models/http_access_log_dao.go +++ b/internal/db/models/http_access_log_dao.go @@ -180,7 +180,7 @@ Loop: // CreateHTTPAccessLog 写入单条访问日志 func (this *HTTPAccessLogDAO) CreateHTTPAccessLog(tx *dbs.Tx, dao *HTTPAccessLogDAO, accessLog *pb.HTTPAccessLog) error { - var day = timeutil.Format("Ymd", time.Unix(accessLog.Timestamp, 0)) + var day = timeutil.FormatTime("Ymd", accessLog.Timestamp) tableDef, err := SharedHTTPAccessLogManager.FindTable(dao.Instance, day, true) if err != nil { return err @@ -240,7 +240,7 @@ func (this *HTTPAccessLogDAO) CreateHTTPAccessLog(tx *dbs.Tx, dao *HTTPAccessLog } } - if accessLogEnableAutoPartial && accessLogRowsPerTable > 0 && lastId%accessLogRowsPerTable == 0 { + if accessLogEnableAutoPartial && accessLogRowsPerTable > 0 && lastId >= accessLogRowsPerTable { SharedHTTPAccessLogManager.ResetTable(dao.Instance, day) } diff --git a/internal/db/models/http_access_log_manager.go b/internal/db/models/http_access_log_manager.go index 6f5bdc42..b3eacacb 100644 --- a/internal/db/models/http_access_log_manager.go +++ b/internal/db/models/http_access_log_manager.go @@ -59,7 +59,15 @@ func (this *HTTPAccessLogManager) FindTableNames(db *dbs.DB, day string) ([]stri } // 排序 - sort.Strings(results) + // 这里不能直接使用sort.Strings(),因为表名里面可能大小写混合 + sort.Slice(results, func(i, j int) bool { + var name1 = results[i] + var name2 = results[j] + if len(name1) < len(name2) { + return true + } + return strings.ToLower(name1) < strings.ToLower(name2) + }) return results, nil } @@ -132,7 +140,8 @@ func (this *HTTPAccessLogManager) FindTable(db *dbs.DB, day string, force bool) if err != nil { return nil, err } - var cacheKey = config.Dsn + var cachePrefix = config.Dsn + var cacheKey = this.composeTableCacheKey(cachePrefix, day) def, ok := this.currentTableMapping[cacheKey] if ok { return def, nil @@ -146,6 +155,18 @@ func (this *HTTPAccessLogManager) FindTable(db *dbs.DB, day string, force bool) // 只有存在的表格才缓存 if def != nil && def.Exists { this.currentTableMapping[cacheKey] = def + + // 清除过时缓存 + for oldCacheKey := range this.currentTableMapping { + var dayIndex = strings.LastIndex(oldCacheKey, "_") + if dayIndex > 0 { + var oldPrefix = oldCacheKey[:dayIndex] + var oldDay = oldCacheKey[dayIndex+1:] + if oldPrefix == cachePrefix && oldDay < day { + delete(this.currentTableMapping, oldCacheKey) + } + } + } } return def, nil } @@ -173,7 +194,7 @@ func (this *HTTPAccessLogManager) ResetTable(db *dbs.DB, day string) { if err != nil { return } - delete(this.currentTableMapping, config.Dsn) + delete(this.currentTableMapping, this.composeTableCacheKey(config.Dsn, day)) } // 查找某个表格 @@ -290,3 +311,9 @@ func (this *HTTPAccessLogManager) checkTableFields(db *dbs.DB, tableName string) } return } + +// 组合表格的缓存Key +func (this *HTTPAccessLogManager) composeTableCacheKey(dsn string, day string) string { + // 注意:格式一定要固定,下面清除缓存的时候需要用到 + return dsn + "_" + day +}