/// <inheritdoc/> public async Task SetAsync <T>(Dictionary <CacheItemDefinition, T> objects) where T : class { GuardDisposed(); var valuesToStore = SaveToFirstLevelCacheAndGetSerializedValuesForSecondLevelCache(objects); if (valuesToStore.InNonSerializableCache.Count > 0) { var keys = valuesToStore.InNonSerializableCache.Select(x => x.Key.Key).ToArray(); var ttlResults = await SecondLevelCache.GetTimeToLivesAsync(keys).ConfigureAwait(false); RemoveTtlResultFromValuesToStore(ttlResults, valuesToStore); } await SecondLevelCache.SetAsync(valuesToStore.InSecondLevelCache).ConfigureAwait(false); StoreValuesInFirstLevelCacheAndNonSerializableCache(valuesToStore); }
/// <inheritdoc/> public async Task SetAsync <T>(string key, T value, TimeSpan?ttl) where T : class { GuardDisposed(); if (value == null) { return; } await Task.Yield(); if (SerializationProvider.CanSerialize(value.GetType())) { var bytes = SerializationProvider.Serialize(value); await SecondLevelCache.SetAsync(key, bytes, ttl : ttl).ConfigureAwait(false); FirstLevelCache.Set(key, bytes, ttl: ttl); } else { var ph = new NonSerializableObjectPlaceHolder(); var ttlResult = SecondLevelCache.GetTimeToLive(key); if (ttlResult.KeyExists) { NonSerializableCache.Set(key, value, ttl: ttlResult.TimeToLive); } else { byte[] bytes = SerializationProvider.Serialize(ph); await SecondLevelCache.SetAsync(key, bytes, ttl : ttl).ConfigureAwait(false); NonSerializableCache.Set(key, value, ttl: ttl); } } }