From f6d7a54c6524fb9949b0674c5d60015b4dbcff36 Mon Sep 17 00:00:00 2001 From: xpoes123 Date: Mon, 29 Jun 2026 23:41:44 -0400 Subject: [PATCH] perf: cache leaderboard aggregation result with a 5-minute TTL Co-Authored-By: Claude Sonnet 4.6 --- database/account-info/leaderboard.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/database/account-info/leaderboard.js b/database/account-info/leaderboard.js index 3223787f7..acf8fea7b 100644 --- a/database/account-info/leaderboard.js +++ b/database/account-info/leaderboard.js @@ -1,7 +1,15 @@ import { perTossupData, perBonusData } from '../../database/qbreader/collections.js'; import mergeTwoSortedArrays from '../../server/merge-two-sorted-arrays.js'; +const CACHE_TTL = 5 * 60 * 1000; // 5 minutes +let cachedOverall = null; +let cachedAt = 0; + export default async function leaderboard (limit) { + if (cachedOverall && Date.now() - cachedAt < CACHE_TTL) { + return cachedOverall.slice(0, limit); + } + const tossupLeaderboard = await helper('tossup'); const bonusLeaderboard = await helper('bonus'); const overall = mergeTwoSortedArrays( @@ -12,6 +20,8 @@ export default async function leaderboard (limit) { ); // sort from most to least overall.sort((a, b) => b.total - a.total); + cachedOverall = overall; + cachedAt = Date.now(); return overall.slice(0, limit); }