diff --git a/MP.IOC/Data/MpDataService.cs b/MP.IOC/Data/MpDataService.cs index cd2cd890..7d55b019 100644 --- a/MP.IOC/Data/MpDataService.cs +++ b/MP.IOC/Data/MpDataService.cs @@ -4828,11 +4828,32 @@ namespace MP.IOC.Data // ...e salvo... await RedisSetHashDictAsync(redKey, result, numSecCache); #endif - // Creiamo i task senza attenderli immediatamente - var delTask = RedisDelKeyAsync(redKey); - var setTask = RedisSetHashDictAsync(redKey, result, numSecCache); - // Attendiamo entrambi i task contemporaneamente (1 solo RTT percepito) - await Task.WhenAll(delTask, setTask); + + bool useTrans = true; + + if (useTrans) + { + // variazione con redis transaction... + var transaction = redisDb.CreateTransaction(); + // 1. Eliminiamo la chiave (rimuove i vecchi campi) + _ = transaction.KeyDeleteAsync(redKey); + // 2. Prepariamo gli HashEntry per il batch (più efficiente di un Dictionary) + HashEntry[] entries = result.Select(kvp => new HashEntry(kvp.Key, kvp.Value)).ToArray(); + // 3. Inseriamo i nuovi valori + _ = transaction.HashSetAsync(redKey, entries); + // 4. Impostiamo l'expiration in un unico colpo + _ = transaction.KeyExpireAsync(redKey, TimeSpan.FromSeconds(numSecCache)); + // Eseguiamo tutto in un unico viaggio verso Redis + bool success = await transaction.ExecuteAsync(); + } + else + { + // Creiamo i task senza attenderli immediatamente + var delTask = RedisDelKeyAsync(redKey); + var setTask = RedisSetHashDictAsync(redKey, result, numSecCache); + // Attendiamo entrambi i task contemporaneamente (1 solo RTT percepito) + await Task.WhenAll(delTask, setTask); + } return result; }