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