CacheResource.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Benchmarks.Model;
  2. using GenHTTP.Modules.Webservices;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Caching.Memory;
  5. namespace Benchmarks.Tests;
  6. public sealed class CacheResource
  7. {
  8. private static readonly Random Random = new();
  9. private static readonly MemoryCache Cache = new(new MemoryCacheOptions
  10. {
  11. ExpirationScanFrequency = TimeSpan.FromMinutes(60)
  12. });
  13. private static readonly object[] CacheKeys = Enumerable.Range(0, 10001).Select(i => new CacheKey(i)).ToArray();
  14. [ResourceMethod(":queries")]
  15. public ValueTask<List<World>> GetWorldsFromPath(string queries) => GetWorlds(queries);
  16. [ResourceMethod]
  17. public async ValueTask<List<World>> GetWorlds(string queries)
  18. {
  19. var count = 1;
  20. int.TryParse(queries, out count);
  21. if (count < 1)
  22. {
  23. count = 1;
  24. }
  25. else if (count > 500)
  26. {
  27. count = 500;
  28. }
  29. var result = new List<World>(count);
  30. var context = Database.NoTrackingPool.Rent();
  31. try
  32. {
  33. for (var i = 0; i < count; i++)
  34. {
  35. var id = Random.Next(1, 10001);
  36. var key = CacheKeys[id];
  37. var data = Cache.Get<World>(key);
  38. if (data != null)
  39. {
  40. result.Add(data);
  41. }
  42. else
  43. {
  44. var resolved = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false);
  45. Cache.Set(key, resolved);
  46. result.Add(resolved);
  47. }
  48. }
  49. }
  50. finally
  51. {
  52. Database.NoTrackingPool.Return(context);
  53. }
  54. return result;
  55. }
  56. public sealed class CacheKey : IEquatable<CacheKey>
  57. {
  58. private readonly int _value;
  59. public CacheKey(int value)
  60. {
  61. _value = value;
  62. }
  63. public bool Equals(CacheKey key) => key._value == _value;
  64. public override bool Equals(object obj) => ReferenceEquals(obj, this);
  65. public override int GetHashCode() => _value;
  66. public override string ToString() => _value.ToString();
  67. }
  68. }