CacheResource.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Benchmarks.Model;
  5. using GenHTTP.Modules.Webservices;
  6. using Microsoft.Extensions.Caching.Memory;
  7. namespace Benchmarks.Tests
  8. {
  9. public sealed class CacheResource
  10. {
  11. private static readonly Random _Random = new Random();
  12. private readonly MemoryCache _Cache = new MemoryCache(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromMinutes(60) });
  13. private static readonly object[] _CacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray();
  14. public sealed class CacheKey : IEquatable<CacheKey>
  15. {
  16. private readonly int _value;
  17. public CacheKey(int value) => _value = value;
  18. public bool Equals(CacheKey key) => key._value == _value;
  19. public override bool Equals(object obj) => ReferenceEquals(obj, this);
  20. public override int GetHashCode() => _value;
  21. public override string ToString() => _value.ToString();
  22. }
  23. [ResourceMethod(":queries")]
  24. public List<World> GetWorldsFromPath(string queries) => GetWorlds(queries);
  25. [ResourceMethod]
  26. public List<World> GetWorlds(string queries)
  27. {
  28. var count = 1;
  29. int.TryParse(queries, out count);
  30. if (count < 1) count = 1;
  31. else if (count > 500) count = 500;
  32. var result = new List<World>(count);
  33. using var context = DatabaseContext.CreateNoTracking();
  34. for (var i = 0; i < count; i++)
  35. {
  36. var id = _Random.Next(1, 10001);
  37. var key = _CacheKeys[id];
  38. var data = _Cache.Get<World>(key);
  39. if (data != null)
  40. {
  41. result.Add(data);
  42. }
  43. else
  44. {
  45. var resolved = context.World.First(w => w.Id == id);
  46. _Cache.Set(key, resolved);
  47. result.Add(resolved);
  48. }
  49. }
  50. return result;
  51. }
  52. }
  53. }