Implemented user deserialize cache
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user