Dieser Code verwaltet eine gleichzeitige Karte, die Daten für eine Kundenkonfiguration speichert. Beim Serverstart werden Daten aus bestimmten Dateien in die Karte geladen. Es überwacht auch neue Dateien und aktualisiert die Karte mit Daten aus diesen Dateien, wodurch der alte Status gelöscht wird.
Das Problem tritt auf, wenn bei der Lesemethode ein Fehler auftritt. In diesem Fall wird die gesamte Karte gelöscht und bleibt leer, obwohl die vorherigen Konfigurationsdaten erhalten bleiben sollten.
Die vorgeschlagene Lösung vereinfacht den Datenverwaltungsprozess:
<code class="go">type CustomerConfig struct { Data map[string]bool // Add other properties if needed LoadedAt time.Time } func loadConfig() (*CustomerConfig, error) { cfg := &CustomerConfig{ Data: map[string]bool{}, LoadedAt: time.Now(), } // Implement the file loading logic here // If an error occurs, return it // If successful, return the config return cfg, nil } type ConfigCache struct { configMu sync.RWMutex config *CustomerConfig closeCh chan struct{} } func NewConfigCache() (*ConfigCache, error) { cfg, err := loadConfig() if err != nil { return nil, fmt.Errorf("loading initial config failed: %w", err) } cc := &ConfigCache{ config: cfg, closeCh: make(chan struct{}), } // Launch goroutine to refresh config go cc.refresher() return cc, nil } func (cc *ConfigCache) refresher() { ticker := time.NewTicker(1 * time.Minute) // Every minute defer ticker.Stop() for { select { case <-ticker.C: // Implement the logic to detect changes changes := false if !changes { continue } cfg, err := loadConfig() if err != nil { log.Printf("Failed to load config: %v", err) continue } cc.configMu.Lock() cc.config = cfg cc.configMu.Unlock() case <-cc.closeCh: return } } } func (cc *ConfigCache) Stop() { close(cc.closeCh) } func (cc *ConfigCache) GetConfig() *CustomerConfig { cc.configMu.RLock() defer cc.configMu.RUnlock() return cc.config }</code>
<code class="go">// Initialize the cache cc, err := NewConfigCache() if err != nil { // Handle the error } // Get the current configuration when needed cfg := cc.GetConfig() // Remember to stop the cache manager when appropriate cc.Stop()</code>
Diese Lösung verhindert das Problem des Verlusts der vorherigen Konfiguration und vereinfacht die Handhabung von Konfigurationsaktualisierungen.
Das obige ist der detaillierte Inhalt vonWie verwaltet man gleichzeitige Kundenkonfigurationsdaten mit inkrementellen Updates und vermeidet Datenverlust?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!