RedisCacheService.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Application.Abstractions.Cache;
  2. using StackExchange.Redis;
  3. using System.Text.Json;
  4. namespace Infrastructure.Cache;
  5. public sealed class RedisCacheService(IConnectionMultiplexer redis) : ICacheService
  6. {
  7. private readonly IDatabase _db = redis.GetDatabase();
  8. private static readonly JsonSerializerOptions _jsonOptions = new()
  9. {
  10. PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
  11. WriteIndented = false
  12. };
  13. public async Task<T?> GetAsync<T>(string key, CancellationToken ct = default)
  14. {
  15. var value = await _db.StringGetAsync(key);
  16. if (value.IsNullOrEmpty)
  17. {
  18. return default;
  19. }
  20. return JsonSerializer.Deserialize<T>((string)value!, _jsonOptions);
  21. }
  22. public async Task SetAsync<T>(string key, T value, CancellationToken ct = default)
  23. {
  24. await _db.StringSetAsync(key, JsonSerializer.Serialize(value, _jsonOptions));
  25. }
  26. public async Task SetAsync<T>(string key, T value, TimeSpan expiry, CancellationToken ct = default)
  27. {
  28. await _db.StringSetAsync(key, JsonSerializer.Serialize(value, _jsonOptions), expiry);
  29. }
  30. public async Task RemoveAsync(string key, CancellationToken ct = default)
  31. {
  32. await _db.KeyDeleteAsync(key);
  33. }
  34. public async Task RemoveByPrefixAsync(string prefix, CancellationToken ct = default)
  35. {
  36. var server = redis.GetServer(_db.Multiplexer.GetEndPoints().First());
  37. var keys = server.Keys(pattern: $"{prefix}*").ToArray();
  38. if (keys.Length > 0)
  39. {
  40. await _db.KeyDeleteAsync(keys);
  41. }
  42. }
  43. }