Add in-memory caching for online count, enable compression, and add staleTimes for router cache
This commit is contained in:
1 parent
b058a3827b
commit
deac10e00a
5 files changed
+51
-10
No files matched your search
@@ -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 });
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in new issue
Block a user