diff --git a/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs b/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs index 3fffbfdb..064ae94c 100644 --- a/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs +++ b/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs @@ -241,13 +241,20 @@ public override async Task BaseSetAllAsync(IDictionary values, Tim { ArgumentCheck.NotNegativeOrZero(expiration, nameof(expiration)); ArgumentCheck.NotNullAndCountGTZero(values, nameof(values)); - - var tasks = new List(); - - foreach (var item in values) - tasks.Add(SetAsync(item.Key, item.Value, expiration, cancellationToken)); - - await Task.WhenAll(tasks); + + var keyValuePairs = values + .ToDictionary( + keySelector: item => (RedisKey)item.Key, + elementSelector: item => (RedisValue)_serializer.Serialize(item.Value)) + .ToArray(); + + ITransaction transaction = _cache.CreateTransaction(); + + _ = transaction.StringSetAsync(keyValuePairs); + foreach (RedisKey key in keyValuePairs.Select(keyVp => keyVp.Key)) + _ = transaction.KeyExpireAsync(key, expiration); + + await transaction.ExecuteAsync(); } /// diff --git a/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs b/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs index fcf9795c..e0558889 100644 --- a/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs +++ b/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs @@ -367,13 +367,20 @@ public override void BaseSetAll(IDictionary values, TimeSpan expir { ArgumentCheck.NotNegativeOrZero(expiration, nameof(expiration)); ArgumentCheck.NotNullAndCountGTZero(values, nameof(values)); - - var batch = _cache.CreateBatch(); - - foreach (var item in values) - batch.StringSetAsync(item.Key, _serializer.Serialize(item.Value), expiration); - - batch.Execute(); + + var keyValuePairs = values + .ToDictionary( + keySelector: item => (RedisKey)item.Key, + elementSelector: item => (RedisValue)_serializer.Serialize(item.Value)) + .ToArray(); + + ITransaction transaction = _cache.CreateTransaction(); + + transaction.StringSetAsync(keyValuePairs); + foreach (RedisKey key in keyValuePairs.Select(keyVp => keyVp.Key)) + transaction.KeyExpireAsync(key, expiration); + + transaction.Execute(); } ///