Implemented user deserialize cache

This commit is contained in:
2026-01-21 01:03:46 -05:00
parent ce093af58e
commit a0a405de85
4 changed files with 88 additions and 21 deletions

View File

@@ -14,6 +14,7 @@ import { toDateTime } from '@app/shared/utils/time';
import { logger } from '../services/logging/logger';
const querystring = require('querystring');
import { performance } from 'perf_hooks';
import { CacheService } from '../services/cache/cache';
function parseJwt(token) {
@@ -189,8 +190,31 @@ passport.deserializeUser(function (user, cb) {
let con;
try {
let t;
//cache lookup
let t = performance.now();
const cachedData: UserData | undefined = userCache.Get(memberID);
timings.cache_lookup = performance.now() - t;
if (cachedData) {
timings.total = performance.now() - start;
logger.info(
'profiling',
'passport.deserializeUser (cache hit)',
{
memberId: memberID,
cache_hit: true,
source: 'cache',
total_ms: timings.total,
breakdown_ms: timings,
},
'profiling'
);
return cb(null, cachedData);
}
//cache miss, db load
t = performance.now();
con = await pool.getConnection();
timings.getConnection = performance.now() - t;
@@ -202,30 +226,30 @@ passport.deserializeUser(function (user, cb) {
);
timings.memberQuery = performance.now() - t;
const userData: {
id: number;
name: string;
roles: Role[];
state: MemberState;
discord_id?: string;
} = userResults[0];
const userData: UserData = userResults[0];
t = performance.now();
const userRoles = await getUserRoles(memberID);
userData.roles = await getUserRoles(memberID) || [];
timings.roles = performance.now() - t;
userData.roles = userRoles || [];
t = performance.now();
userData.state = await getUserState(memberID);
timings.state = performance.now() - t;
// 📊 PROFILING LOG
t = performance.now();
userCache.Set(userData.id, userData);
timings.cache_set = performance.now() - t;
timings.total = performance.now() - start;
logger.info(
'profiling',
'passport.deserializeUser completed',
'passport.deserializeUser (db load)',
{
memberId: memberID,
total_ms: performance.now() - start,
cache_hit: false,
source: 'db',
total_ms: timings.total,
breakdown_ms: timings,
},
'profiling'
@@ -243,14 +267,12 @@ passport.deserializeUser(function (user, cb) {
}
);
return cb(error);
} finally {
if (con) con.release();
}
});
});
declare global {
namespace Express {
interface Request {
@@ -265,5 +287,15 @@ declare global {
}
}
export interface UserData {
id: number;
name: string;
roles: Role[];
state: MemberState;
discord_id?: string;
}
export const authRouter = router;
const userCache = new CacheService<number, UserData>();
export const authRouter = router;
export const memberCache = userCache;