No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

69 líneas
2.2KB

  1. using HealthMonitor.Core.Dal;
  2. using HealthMonitor.Util.Entities.HealthMonitor;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. namespace HealthMonitor.Service.Cache
  8. {
  9. public class BloodPressReferenceValueCacheManager
  10. {
  11. private readonly ILogger<BloodPressReferenceValueCacheManager> _logger;
  12. protected readonly IHealthMonitorDataAccessor _dataAccessor;
  13. private static object _syncLocker = new object();
  14. private MD5 _md5;
  15. private const string CACHE_KEY_BP_REF_VALUE = "HM_REF_Val_";
  16. public BloodPressReferenceValueCacheManager(
  17. IHealthMonitorDataAccessor dataAccessor,
  18. ILogger<BloodPressReferenceValueCacheManager> logger
  19. )
  20. {
  21. _md5 = MD5.Create();
  22. _dataAccessor = dataAccessor;
  23. _logger = logger;
  24. }
  25. public async Task<HmBloodPressReferenceValue> GetBloodPressReferenceValueAsync(int age, int gender,bool isHypertension)
  26. {
  27. var hashModel = new
  28. {
  29. Index = $"{age}-{gender}-{isHypertension}"
  30. };
  31. var hash = ComputeHash(hashModel);
  32. var cacheKey = CACHE_KEY_BP_REF_VALUE + $"{hash}";
  33. var bpRef = await RedisHelper.GetAsync<HmBloodPressReferenceValue>(cacheKey).ConfigureAwait(false);
  34. if (bpRef == null)
  35. {
  36. bpRef = _dataAccessor
  37. .GetFirstOrDefault<HmBloodPressReferenceValue>(
  38. i =>
  39. i.Age.Equals(age) &&
  40. i.Gender.Equals(gender) &&
  41. i.Hypertension.Equals(isHypertension)
  42. );
  43. ;
  44. await RedisHelper.SetAsync(cacheKey, JsonConvert.SerializeObject(bpRef));
  45. }
  46. return bpRef;
  47. }
  48. private string ComputeHash(object data)
  49. {
  50. lock (_syncLocker)
  51. {
  52. var value = JsonConvert.SerializeObject(data);
  53. value = Convert.ToBase64String(_md5.ComputeHash(Encoding.UTF8.GetBytes(value)));
  54. return value;
  55. }
  56. }
  57. }
  58. }