CacheResource.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. await using var context = DatabaseContext.CreateNoTracking();
  31. for (var i = 0; i < count; i++)
  32. {
  33. var id = Random.Next(1, 10001);
  34. var key = CacheKeys[id];
  35. var data = Cache.Get<World>(key);
  36. if (data != null)
  37. {
  38. result.Add(data);
  39. }
  40. else
  41. {
  42. var resolved = await context.World.FirstOrDefaultAsync(w => w.Id == id).ConfigureAwait(false);
  43. Cache.Set(key, resolved);
  44. result.Add(resolved);
  45. }
  46. }
  47. return result;
  48. }
  49. public sealed class CacheKey : IEquatable<CacheKey>
  50. {
  51. private readonly int _value;
  52. public CacheKey(int value)
  53. {
  54. _value = value;
  55. }
  56. public bool Equals(CacheKey key) => key._value == _value;
  57. public override bool Equals(object obj) => ReferenceEquals(obj, this);
  58. public override int GetHashCode() => _value;
  59. public override string ToString() => _value.ToString();
  60. }
  61. }