RedisChatMessageStore.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Application.Abstractions.Cache;
  2. using Application.Abstractions.Chat;
  3. using StackExchange.Redis;
  4. using System.Text.Json;
  5. namespace Infrastructure.Chat;
  6. public class RedisChatMessageStore(IConnectionMultiplexer redis) : IChatMessageStore
  7. {
  8. private readonly IDatabase _db = redis.GetDatabase();
  9. private static readonly JsonSerializerOptions _jsonOptions = new()
  10. {
  11. PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
  12. WriteIndented = false
  13. };
  14. public async Task AddMessageAsync(string channelSID, ChatMessage message)
  15. {
  16. var json = JsonSerializer.Serialize(message, _jsonOptions);
  17. var key = CacheKeys.ChatChannelMessages(channelSID);
  18. await _db.ListLeftPushAsync(key, json);
  19. await _db.ListTrimAsync(key, 0, ChatSettings.MaxMessages - 1);
  20. }
  21. public async Task<IReadOnlyList<ChatMessage>> GetRecentMessagesAsync(string channelSID, int count)
  22. {
  23. var key = CacheKeys.ChatChannelMessages(channelSID);
  24. var values = await _db.ListRangeAsync(key, 0, count - 1);
  25. if (values.Length <= 0)
  26. {
  27. return [];
  28. }
  29. var messages = new List<ChatMessage>(values.Length);
  30. foreach (var row in values)
  31. {
  32. if (!row.IsNullOrEmpty)
  33. {
  34. var message = JsonSerializer.Deserialize<ChatMessage>((string)row!, _jsonOptions);
  35. if (message is not null)
  36. {
  37. messages.Add(message);
  38. }
  39. }
  40. }
  41. messages.Reverse();
  42. return messages;
  43. }
  44. public async Task ClearChannelAsync(string channelSID)
  45. {
  46. await _db.KeyDeleteAsync(CacheKeys.ChatChannelMessages(channelSID));
  47. }
  48. }