Add in-memory caching for online count, enable compression, and add staleTimes for router cache

This commit is contained in:
openhands committed 2026-07-09 18:24:58 +02:00
1 parent b058a3827b
commit deac10e00a
5 files changed
+51 -10

No files matched your search

+4 -4
View File
@@ -4,16 +4,16 @@
// { count: 0 } (never 500) on DB failure.
import { apiJson } from "@/lib/api";
import { cached } from "@/lib/cache";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
export async function GET(_req: Request) {
try {
const count = await prisma.user.count({
where: { online: "1" },
});
const count = await cached("online_count", 10_000, () =>
prisma.user.count({ where: { online: "1" } }),
);
return apiJson({ count });
} catch {
return apiJson({ count: 0 });
+2
View File
@@ -67,6 +67,8 @@ export default async function RootLayout({ children }: { children: ReactNode })
<head>
<meta name="theme-default-dark" content={String(defaultDark)} />
<script src="/scripts/theme-init.js" />
<link rel="preconnect" href="https://www.habbo.com" />
<link rel="dns-prefetch" href="https://www.habbo.com" />
</head>
<body
className="flex min-h-screen flex-col site-bg"
+4 -1
View File
@@ -1,6 +1,7 @@
import { getTranslations } from "next-intl/server";
import Link from "next/link";
import { auth } from "@/lib/auth";
import { cached } from "@/lib/cache";
import { prisma } from "@/lib/prisma";
import { siteSettings } from "@/lib/services/site-settings";
@@ -15,7 +16,9 @@ export async function SiteHeader() {
let online = 0;
try {
online = await prisma.user.count({ where: { online: "1" } });
online = await cached("online_count", 10_000, () =>
prisma.user.count({ where: { online: "1" } }),
);
} catch {
online = 0;
}
+17
View File
@@ -0,0 +1,17 @@
type CacheEntry<T> = { data: T; expiresAt: number };
const store = new Map<string, CacheEntry<unknown>>();
export function cached<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {
const existing = store.get(key);
if (existing && existing.expiresAt > Date.now()) {
return Promise.resolve(existing.data as T);
}
return fn().then((data) => {
store.set(key, { data, expiresAt: Date.now() + ttlMs });
return data;
});
}
export function bustCache(key: string): void {
store.delete(key);
}