RedisRepository.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Text.Json;
  2. using StackExchange.Redis;
  3. namespace bitforum.Repository
  4. {
  5. public record RedisConfig(string Host, int Port, string Password);
  6. public interface IRedisRepository
  7. {
  8. // 문자열 저장
  9. Task SetStringAsync(string key, string value, int expirationMinutes);
  10. // 문자열 조회
  11. Task<string?> GetStringAsync(string key);
  12. // 객체 저장 (JSON 직렬화)
  13. Task SetObjectAsync<T>(string key, T value, int expirationMinutes);
  14. // 객체 가져오기 (JSON 역직렬화)
  15. Task<T?> GetObjectAsync<T>(string key);
  16. // 삭제 메소드 추가
  17. Task<bool> DeleteAsync(string key);
  18. // 키 존재 여부 확인
  19. Task<bool> ExistsAsync(string key);
  20. // 모든 키 삭제
  21. Task ClearAllAsync();
  22. }
  23. public class RedisRepository: IRedisRepository
  24. {
  25. private readonly IDatabase _db;
  26. private readonly IConnectionMultiplexer _redis;
  27. private const int _expirationMinutes = 10;
  28. public RedisRepository(IConnectionMultiplexer redis)
  29. {
  30. _db = redis.GetDatabase();
  31. _redis = redis;
  32. }
  33. public async Task SetStringAsync(string key, string value, int expirationMinutes = _expirationMinutes)
  34. {
  35. await _db.StringSetAsync(key, value, TimeSpan.FromMinutes(expirationMinutes));
  36. }
  37. public async Task<string?> GetStringAsync(string key)
  38. {
  39. return await _db.StringGetAsync(key);
  40. }
  41. public async Task SetObjectAsync<T>(string key, T value, int expirationMinutes = _expirationMinutes)
  42. {
  43. string jsonData = JsonSerializer.Serialize(value);
  44. await _db.StringSetAsync(key, jsonData, TimeSpan.FromMinutes(expirationMinutes));
  45. }
  46. public async Task<T?> GetObjectAsync<T>(string key)
  47. {
  48. string? jsonData = await _db.StringGetAsync(key);
  49. return jsonData == null ? default : JsonSerializer.Deserialize<T>(jsonData);
  50. }
  51. public async Task<bool> DeleteAsync(string key)
  52. {
  53. return await _db.KeyDeleteAsync(key);
  54. }
  55. public async Task<bool> ExistsAsync(string key)
  56. {
  57. return await _db.KeyExistsAsync(key);
  58. }
  59. public async Task ClearAllAsync()
  60. {
  61. foreach (var endpoint in _redis.GetEndPoints())
  62. {
  63. await _redis.GetServer(endpoint).FlushDatabaseAsync();
  64. }
  65. }
  66. }
  67. }