IChatLeaderboard.cs 830 B

123456789101112131415161718
  1. using Application.Abstractions.Data;
  2. namespace Application.Abstractions.Chat;
  3. /// <summary>
  4. /// 방송 세션별 멤버 XP 랭킹 캐시.
  5. /// ChatHub 에서 매 메시지마다 GROUP BY 로 전체 세션 스캔하던 비용을 회피하기 위해 Redis Sorted Set 으로 캐시.
  6. /// TTL 만료 시 DB 에서 재시드 — TTL 동안의 stale 은 라이브 채팅 UX 상 허용.
  7. /// </summary>
  8. public interface IChatLeaderboard
  9. {
  10. /// <summary>
  11. /// 세션 내 본인 점수와 본인보다 높은 점수자 수를 반환.
  12. /// 캐시 미스 시 DB MemberExpLog GROUP BY 로 재구축 후 캐시.
  13. /// 세션에 데이터 없거나 본인 항목 없으면 null.
  14. /// </summary>
  15. Task<(int MyScore, int HigherCount)?> GetRankAsync(int sessionId, int memberId, IAppDbContext db, CancellationToken ct = default);
  16. }