public async Task GetOrSet_FourSimultaneous() { await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>())) { await cacheStack.SetAsync("GetOrSet", new CacheEntry <int>(15, DateTime.UtcNow.AddDays(-1))); for (var i = 0; i < WorkIterations; i++) { var task1 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) => { await Task.Delay(30); return(12); }, new CacheSettings(TimeSpan.FromDays(1))); var task2 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) => { await Task.Delay(30); return(12); }, new CacheSettings(TimeSpan.FromDays(1))); var task3 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) => { await Task.Delay(30); return(12); }, new CacheSettings(TimeSpan.FromDays(1))); var task4 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) => { await Task.Delay(30); return(12); }, new CacheSettings(TimeSpan.FromDays(1))); await task1; await task2; await task3; await task4; } } }
public async Task CacheTower_MemoryCacheLayer_ViaCacheStack() { await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>())) { await LoopActionAsync(Iterations, async() => { await cacheStack.SetAsync("TestKey", 123, TimeSpan.FromDays(1)); await cacheStack.GetAsync <int>("TestKey"); await cacheStack.GetOrSetAsync <string>("GetOrSet_TestKey", (old) => { return(Task.FromResult("Hello World")); }, new CacheSettings(TimeSpan.FromDays(1), TimeSpan.FromDays(1))); }); } }
public async Task GetOrSet_UnderLoad() { await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>())) { await cacheStack.SetAsync("GetOrSet", new CacheEntry <int>(15, DateTime.UtcNow.AddDays(-1))); Parallel.For(0, WorkIterations, async value => { await cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) => { await Task.Delay(30); return(12); }, new CacheSettings(TimeSpan.FromDays(1))); }); } }
public async Task GetOrSet_BackPropagatesToEarlierCacheLayers() { var layer1 = new MemoryCacheLayer(); var layer2 = new MemoryCacheLayer(); var layer3 = new MemoryCacheLayer(); await using var cacheStack = new CacheStack(new[] { layer1, layer2, layer3 }, Array.Empty <ICacheExtension>()); var cacheEntry = new CacheEntry <int>(42, TimeSpan.FromDays(1)); await layer2.SetAsync("GetOrSet_BackPropagatesToEarlierCacheLayers", cacheEntry); var cacheEntryFromStack = await cacheStack.GetOrSetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers", (old) => { return(Task.FromResult(14)); }, new CacheSettings(TimeSpan.FromDays(1), TimeSpan.FromMinutes(1))); Assert.AreEqual(cacheEntry.Value, cacheEntryFromStack); //Give enough time for the background task back propagation to happen await Task.Delay(2000); Assert.AreEqual(cacheEntry, await layer1.GetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers")); Assert.IsNull(await layer3.GetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers")); }
public async Task GetOrSet_CacheHitBackgroundRefresh() { await using var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()); var cacheEntry = new CacheEntry <int>(17, DateTime.UtcNow.AddDays(1)); await cacheStack.SetAsync("GetOrSet_CacheHitBackgroundRefresh", cacheEntry); var waitingOnBackgroundTask = new TaskCompletionSource <int>(); var result = await cacheStack.GetOrSetAsync <int>("GetOrSet_CacheHitBackgroundRefresh", (oldValue) => { waitingOnBackgroundTask.TrySetResult(27); return(Task.FromResult(27)); }, new CacheSettings(TimeSpan.FromDays(2), TimeSpan.Zero)); Assert.AreEqual(17, result); await waitingOnBackgroundTask.Task; //Give 400ms to return the value and set it to the MemoryCacheLayer await Task.Delay(400); var refetchedResult = await cacheStack.GetAsync <int>("GetOrSet_CacheHitBackgroundRefresh"); Assert.AreEqual(27, refetchedResult.Value); }
public async Task GetOrSet_ThrowsOnNullGetter() { var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()); await cacheStack.GetOrSetAsync <int>("MyCacheKey", null, new CacheSettings(TimeSpan.FromDays(1))); }
public async Task GetOrSet_ThrowsOnNullKey() { var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()); await cacheStack.GetOrSetAsync <int>(null, (old) => Task.FromResult(5), new CacheSettings(TimeSpan.FromDays(1))); }