comment เคลียร์ redis

This commit is contained in:
Adisak 2026-06-15 18:26:34 +07:00
parent c398354208
commit 84fd3fb9e5
2 changed files with 665 additions and 668 deletions

View file

@ -8703,40 +8703,43 @@ export class OrganizationController extends Controller {
await queryRunner.commitTransaction(); await queryRunner.commitTransaction();
// Clear Redis cache after successful publish // Clear Redis cache after successful publish (only menu and role for menu display)
const redis = require("redis"); // const redis = require("redis");
const { promisify } = require("util"); // const { promisify } = require("util");
const redisClient = redis.createClient({ // const redisClient = redis.createClient({
host: process.env.REDIS_HOST || "localhost", // host: process.env.REDIS_HOST || "localhost",
port: parseInt(process.env.REDIS_PORT || "6379"), // port: parseInt(process.env.REDIS_PORT || "6379"),
}); // });
const keysAsync = promisify(redisClient.keys).bind(redisClient); // const keysAsync = promisify(redisClient.keys).bind(redisClient);
const delAsync = promisify(redisClient.del).bind(redisClient); // const delAsync = promisify(redisClient.del).bind(redisClient);
try { // try {
const [posMasterKeys, userKeys, orgKeys, menuKeys, roleKeys] = await Promise.all([ // // Clear only menu and role cache (affects menu display)
keysAsync("posMaster_*"), // const menuRolePatterns = ["menu_*", "role_*"];
keysAsync("user_*"), // let totalCleared = 0;
keysAsync("org_*"),
keysAsync("menu_*"),
keysAsync("role_*"),
]);
if (posMasterKeys.length > 0) await delAsync(...posMasterKeys); // for (const pattern of menuRolePatterns) {
if (userKeys.length > 0) await delAsync(...userKeys); // const keys = await keysAsync(pattern);
if (orgKeys.length > 0) await delAsync(...orgKeys); // if (keys.length > 0) {
if (menuKeys.length > 0) await delAsync(...menuKeys); // // Delete in chunks of 1000 to avoid argument limit
if (roleKeys.length > 0) await delAsync(...roleKeys); // const chunkSize = 1000;
// for (let i = 0; i < keys.length; i += chunkSize) {
// const chunk = keys.slice(i, i + chunkSize);
// await delAsync(...chunk);
// }
// totalCleared += keys.length;
// console.log(`[moveDraftToCurrent] Cleared ${keys.length} cache keys for pattern: ${pattern}`);
// }
// }
// console.log(`[moveDraftToCurrent] Total cache cleared: ${totalCleared} keys`);
// } catch (err) {
// console.error("[moveDraftToCurrent] Error clearing cache:", err);
// } finally {
// redisClient.quit();
// }
console.log(`[moveDraftToCurrent] Cleared cache: posMaster=${posMasterKeys.length}, user=${userKeys.length}, org=${orgKeys.length}, menu=${menuKeys.length}, role=${roleKeys.length}`); // // Invalidate memory cache
} catch (err) { // orgStructureCache.invalidate(currentRevisionId);
console.error("[moveDraftToCurrent] Error clearing cache:", err);
} finally {
redisClient.quit();
}
// Invalidate memory cache
orgStructureCache.invalidate(currentRevisionId);
return new HttpSuccess(summary); return new HttpSuccess(summary);
} catch (error) { } catch (error) {

View file

@ -1737,6 +1737,7 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
} }
async function clearMenuAndRoleCache(): Promise<void> { async function clearMenuAndRoleCache(): Promise<void> {
console.log("[AMQ] clearMenuAndRoleCache: Starting...");
const redisClient = redis.createClient({ const redisClient = redis.createClient({
host: REDIS_HOST, host: REDIS_HOST,
port: REDIS_PORT, port: REDIS_PORT,
@ -1746,35 +1747,28 @@ async function clearMenuAndRoleCache(): Promise<void> {
const delAsync = promisify(redisClient.del).bind(redisClient); const delAsync = promisify(redisClient.del).bind(redisClient);
try { try {
const menuKeys = await keysAsync("menu_*"); // Clear menu and role cache (patterns that affect menu display)
if (menuKeys.length > 0) { const menuRolePatterns = ["menu_*", "role_*"];
await delAsync(...menuKeys);
console.log(`[AMQ] Cleared ${menuKeys.length} menu cache keys`);
}
const roleKeys = await keysAsync("role_*"); for (const pattern of menuRolePatterns) {
if (roleKeys.length > 0) { console.log(`[AMQ] Checking pattern: ${pattern}`);
await delAsync(...roleKeys); const keys = await keysAsync(pattern);
console.log(`[AMQ] Cleared ${roleKeys.length} role cache keys`); console.log(`[AMQ] Found ${keys.length} keys for pattern: ${pattern}`);
if (keys.length > 0) {
// Delete in chunks of 1000 to avoid argument limit
const chunkSize = 1000;
for (let i = 0; i < keys.length; i += chunkSize) {
const chunk = keys.slice(i, i + chunkSize);
await delAsync(...chunk);
} }
console.log(`[AMQ] Cleared ${keys.length} cache keys for pattern: ${pattern}`);
const posMasterKeys = await keysAsync("posMaster_*"); } else {
if (posMasterKeys.length > 0) { console.log(`[AMQ] No keys found for pattern: ${pattern}`);
await delAsync(...posMasterKeys);
console.log(`[AMQ] Cleared ${posMasterKeys.length} posMaster cache keys`);
} }
const userKeys = await keysAsync("user_*");
if (userKeys.length > 0) {
await delAsync(...userKeys);
console.log(`[AMQ] Cleared ${userKeys.length} user cache keys`);
}
const orgKeys = await keysAsync("org_*");
if (orgKeys.length > 0) {
await delAsync(...orgKeys);
console.log(`[AMQ] Cleared ${orgKeys.length} org cache keys`);
} }
console.log("[AMQ] clearMenuAndRoleCache: Completed successfully");
} catch (error) {
console.error("[AMQ] clearMenuAndRoleCache ERROR:", error);
} finally { } finally {
redisClient.quit(); redisClient.quit();
} }