From 0a36acda24f6d07def59b6b4ab4024fc62cfd865 Mon Sep 17 00:00:00 2001 From: "direct-dev.ru" Date: Thu, 9 Apr 2026 17:17:20 +0600 Subject: [PATCH] =?UTF-8?q?change=20module=20name=2022=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=BA=D1=8D=D1=88=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B5?= =?UTF-8?q?=20=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B8?= =?UTF-8?q?=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/linedb/cache.go | 32 +++++++++++++++++++++++ pkg/linedb/line_db.go | 59 ++++++++++++------------------------------- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/pkg/linedb/cache.go b/pkg/linedb/cache.go index 1683be4..d4e2a60 100644 --- a/pkg/linedb/cache.go +++ b/pkg/linedb/cache.go @@ -1,6 +1,7 @@ package linedb import ( + "strings" "sync" "time" ) @@ -94,6 +95,37 @@ func (c *RecordCache) Clear() { c.cache = make(map[string]*CacheEntry) } +// ClearCollection удаляет записи кэша, относящиеся к коллекции collectionName: +// ключи ReadByFilter ("collection:filter" и "collection_part:filter") и SetByRecord ("id:collection", "id:collection_part"). +func (c *RecordCache) ClearCollection(collectionName string) { + if collectionName == "" { + c.Clear() + return + } + c.mutex.Lock() + defer c.mutex.Unlock() + for key := range c.cache { + if cacheKeyBelongsToCollection(key, collectionName) { + delete(c.cache, key) + } + } +} + +func cacheKeyBelongsToCollection(key, collectionName string) bool { + if strings.HasPrefix(key, collectionName+":") { + return true + } + if strings.HasPrefix(key, collectionName+"_") { + return true + } + idx := strings.LastIndex(key, ":") + if idx < 0 { + return false + } + suf := key[idx+1:] + return suf == collectionName || strings.HasPrefix(suf, collectionName+"_") +} + // ClearEntriesContainingIDs удаляет из кэша только те записи, в данных которых // встречается хотя бы один из переданных id. Если ids пуст — ничего не делает. func (c *RecordCache) ClearEntriesContainingIDs(ids []any) { diff --git a/pkg/linedb/line_db.go b/pkg/linedb/line_db.go index bc52d28..7864415 100644 --- a/pkg/linedb/line_db.go +++ b/pkg/linedb/line_db.go @@ -392,12 +392,7 @@ func (db *LineDb) Insert(data any, collectionName string, options LineDbAdapterO return fmt.Errorf("failed to write data: %w", err) } - // Обновляем кэш - if db.cacheExternal != nil { - for _, item := range resultDataArray { - db.cacheExternal.UpdateCacheAfterInsert(item, collectionName) - } - } + db.clearCacheForCollection(collectionName) return nil } @@ -530,10 +525,7 @@ func (db *LineDb) Update(data any, collectionName string, filter any, options Li return nil, err } if used { - if db.cacheExternal != nil { - ids := extractIDsFromRecords(result) - db.cacheExternal.ClearEntriesContainingIDs(ids) - } + db.clearCacheForCollection(collectionName) return result, nil } } @@ -552,10 +544,7 @@ func (db *LineDb) Update(data any, collectionName string, filter any, options Li } } } - if db.cacheExternal != nil { - ids := extractIDsFromRecords(result) - db.cacheExternal.ClearEntriesContainingIDs(ids) - } + db.clearCacheForCollection(collectionName) return result, nil } @@ -596,10 +585,7 @@ func (db *LineDb) Delete(data any, collectionName string, options LineDbAdapterO return nil, err } if used { - if db.cacheExternal != nil { - ids := extractIDsFromRecords(result) - db.cacheExternal.ClearEntriesContainingIDs(ids) - } + db.clearCacheForCollection(collectionName) return result, nil } } @@ -618,10 +604,7 @@ func (db *LineDb) Delete(data any, collectionName string, options LineDbAdapterO } } } - if db.cacheExternal != nil { - ids := extractIDsFromRecords(result) - db.cacheExternal.ClearEntriesContainingIDs(ids) - } + db.clearCacheForCollection(collectionName) return result, nil } @@ -758,15 +741,21 @@ func (db *LineDb) ClearCache(collectionName string, options LineDbAdapterOptions if collectionName == "" { db.cacheExternal.Clear() } else { - // Очищаем только записи для конкретной коллекции - // Это упрощенная реализация - db.cacheExternal.Clear() + db.cacheExternal.ClearCollection(collectionName) } } return nil } +// clearCacheForCollection сбрасывает кэш запросов по логической коллекции (включая ключи партиций base_*). +func (db *LineDb) clearCacheForCollection(collectionName string) { + if db.cacheExternal == nil || collectionName == "" { + return + } + db.cacheExternal.ClearCollection(collectionName) +} + // Close закрывает базу данных func (db *LineDb) Close() { db.mutex.Lock() @@ -1561,24 +1550,6 @@ func (db *LineDb) compareIDs(a, b any) bool { return a == b } -// extractIDsFromRecords извлекает id из списка записей (map[string]any). -func extractIDsFromRecords(records []any) []any { - if len(records) == 0 { - return nil - } - ids := make([]any, 0, len(records)) - for _, rec := range records { - m, ok := rec.(map[string]any) - if !ok { - continue - } - if id, exists := m["id"]; exists && id != nil { - ids = append(ids, id) - } - } - return ids -} - func (db *LineDb) generateCacheKey(filter any, collectionName string) string { // Упрощенная реализация генерации ключа кэша return fmt.Sprintf("%s:%v", collectionName, filter) @@ -1677,6 +1648,7 @@ func (db *LineDb) updatePartitioned(data any, collectionName string, filter any, } } + db.clearCacheForCollection(collectionName) return allResults, nil } @@ -1710,6 +1682,7 @@ func (db *LineDb) deletePartitioned(data any, collectionName string, options Lin } } + db.clearCacheForCollection(collectionName) return allResults, nil }