altro test con redis transaction unica

This commit is contained in:
Samuele Locatelli
2026-04-18 15:33:52 +02:00
parent 7e0f73d9d2
commit d7a66d69cb
+26 -5
View File
@@ -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;
}