RedisChatMessageStore.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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 sealed 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(ChatMessage message)
  15. {
  16. var json = JsonSerializer.Serialize(message, _jsonOptions);
  17. await _db.ListLeftPushAsync(CacheKeys.ChatGlobalMessages, json);
  18. await _db.ListTrimAsync(CacheKeys.ChatGlobalMessages, 0, ChatSettings.MaxMessages - 1);
  19. }
  20. public async Task<IReadOnlyList<ChatMessage>> GetRecentMessagesAsync(int count)
  21. {
  22. var values = await _db.ListRangeAsync(CacheKeys.ChatGlobalMessages, 0, count - 1);
  23. if (values.Length <= 0)
  24. {
  25. return [];
  26. }
  27. var messages = new List<ChatMessage>(values.Length);
  28. foreach (var row in values)
  29. {
  30. if (!row.IsNullOrEmpty)
  31. {
  32. var message = JsonSerializer.Deserialize<ChatMessage>((string)row!, _jsonOptions);
  33. if (message is not null)
  34. {
  35. messages.Add(message);
  36. }
  37. }
  38. }
  39. messages.Reverse();
  40. return messages;
  41. }
  42. }