final POC
This commit is contained in:
@@ -307,7 +307,12 @@ export class RedisService {
|
||||
// Generic Redis methods for game data
|
||||
public async get(key: string): Promise<string | null> {
|
||||
try {
|
||||
return await this.client.get(key);
|
||||
const value = await this.client.get(key);
|
||||
// Refresh TTL on access for game-related keys
|
||||
if (value && this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // Reset to 30 minutes
|
||||
}
|
||||
return value;
|
||||
} catch (error) {
|
||||
logError(`Failed to get key ${key}`, error as Error);
|
||||
return null;
|
||||
@@ -317,6 +322,10 @@ export class RedisService {
|
||||
public async set(key: string, value: string): Promise<void> {
|
||||
try {
|
||||
await this.client.set(key, value);
|
||||
// Auto-expire game-related keys after 30 minutes
|
||||
if (this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // 30 minutes
|
||||
}
|
||||
} catch (error) {
|
||||
logError(`Failed to set key ${key}`, error as Error);
|
||||
}
|
||||
@@ -341,6 +350,10 @@ export class RedisService {
|
||||
public async setAdd(key: string, member: string): Promise<void> {
|
||||
try {
|
||||
await this.client.sAdd(key, member);
|
||||
// Refresh TTL for game-related keys
|
||||
if (this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // Reset to 30 minutes
|
||||
}
|
||||
} catch (error) {
|
||||
logError(`Failed to add member to set ${key}`, error as Error);
|
||||
}
|
||||
@@ -349,6 +362,10 @@ export class RedisService {
|
||||
public async setRemove(key: string, member: string): Promise<void> {
|
||||
try {
|
||||
await this.client.sRem(key, member);
|
||||
// Refresh TTL for game-related keys
|
||||
if (this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // Reset to 30 minutes
|
||||
}
|
||||
} catch (error) {
|
||||
logError(`Failed to remove member from set ${key}`, error as Error);
|
||||
}
|
||||
@@ -356,7 +373,12 @@ export class RedisService {
|
||||
|
||||
public async setMembers(key: string): Promise<string[]> {
|
||||
try {
|
||||
return await this.client.sMembers(key);
|
||||
const members = await this.client.sMembers(key);
|
||||
// Refresh TTL on access for game-related keys
|
||||
if (members.length > 0 && this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // Reset to 30 minutes
|
||||
}
|
||||
return members;
|
||||
} catch (error) {
|
||||
logError(`Failed to get members of set ${key}`, error as Error);
|
||||
return [];
|
||||
@@ -366,10 +388,36 @@ export class RedisService {
|
||||
public async exists(key: string): Promise<boolean> {
|
||||
try {
|
||||
const result = await this.client.exists(key);
|
||||
// Refresh TTL on access for game-related keys
|
||||
if (result === 1 && this.isGameRelatedKey(key)) {
|
||||
await this.client.expire(key, 1800); // Reset to 30 minutes
|
||||
}
|
||||
return result === 1;
|
||||
} catch (error) {
|
||||
logError(`Failed to check existence of key ${key}`, error as Error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a key is game-related and should have auto-expiration
|
||||
* Game-related patterns: gameplay:*, game:*, game_*, board:*, game_pending_card:*, etc.
|
||||
*/
|
||||
private isGameRelatedKey(key: string): boolean {
|
||||
const gamePatterns = [
|
||||
'gameplay:',
|
||||
'game:',
|
||||
'game_',
|
||||
'board:',
|
||||
'game_pending_card:',
|
||||
'game_pending_decision:',
|
||||
'game_player_extra_turns:',
|
||||
'game_player_turns_to_lose:',
|
||||
'game_positions:',
|
||||
'game_ready:',
|
||||
'game_room:',
|
||||
'active_game:'
|
||||
];
|
||||
return gamePatterns.some(pattern => key.startsWith(pattern));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user