IPaperLeaderboardCache.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Application.Abstractions.Data;
  2. using Application.Helpers;
  3. namespace Application.Abstractions.Paper;
  4. /// <summary>리더보드 페이지 1행 — 회원 PK·점수·순위(0-based).</summary>
  5. public sealed record PaperLeaderboardRow(int MemberID, int Score, long Rank);
  6. /// <summary>내 순위 조회 결과 — 순위(0-based)·점수·전체 등재 수.</summary>
  7. public sealed record PaperLeaderboardMyRank(long Rank, int Score, long Total);
  8. /// <summary>
  9. /// 모의투자 리더보드 Redis Sorted Set 캐시 (d4 M3 리더보드 백엔드 구현).
  10. /// (sort, period) 조합별 Sorted Set. 캐시 미스 시 DB 재시드(TTL ~25h) — RedisChatLeaderboard 패턴 복제.
  11. /// return/winrate 는 높을수록 상위, mdd 는 낮을수록 상위.
  12. /// </summary>
  13. public interface IPaperLeaderboardCache
  14. {
  15. /// <summary>
  16. /// 지정 (sort, period)의 순위 페이지(offset, count)를 반환. 캐시 미스 시 DB 로 재시드.
  17. /// 등재 계좌가 없으면 빈 목록.
  18. /// </summary>
  19. Task<IReadOnlyList<PaperLeaderboardRow>> GetPageAsync(
  20. PaperLeaderboardSort sort,
  21. PaperLeaderboardPeriod period,
  22. int offset,
  23. int count,
  24. IAppDbContext db,
  25. int minFillsForRank,
  26. CancellationToken ct = default);
  27. /// <summary>
  28. /// 지정 (sort, period)에서 회원의 순위·점수·전체 등재 수. 미등재면 null.
  29. /// </summary>
  30. Task<PaperLeaderboardMyRank?> GetMyRankAsync(
  31. PaperLeaderboardSort sort,
  32. PaperLeaderboardPeriod period,
  33. int memberID,
  34. IAppDbContext db,
  35. int minFillsForRank,
  36. CancellationToken ct = default);
  37. }