mirror of
https://github.com/LukeHagar/pypistats.dev.git
synced 2025-12-06 20:57:50 +00:00
Refactor Redis client implementation in redis.ts to use Bun's RedisClient, improving connection management and error handling. Remove unused clearCache method from data-processor.ts to streamline code.
This commit is contained in:
@@ -101,7 +101,6 @@ export class DataProcessor {
|
|||||||
|
|
||||||
// Mark processed and clear cache
|
// Mark processed and clear cache
|
||||||
await this.cache.set(processedKey, true, 60 * 60 * 24 * 14); // remember for 14 days
|
await this.cache.set(processedKey, true, 60 * 60 * 24 * 14); // remember for 14 days
|
||||||
await this.clearCache();
|
|
||||||
|
|
||||||
console.log('ETL process completed successfully');
|
console.log('ETL process completed successfully');
|
||||||
return results;
|
return results;
|
||||||
@@ -281,19 +280,6 @@ export class DataProcessor {
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear all cache after data update
|
|
||||||
*/
|
|
||||||
private async clearCache(): Promise<void> {
|
|
||||||
console.log('Clearing cache after data update');
|
|
||||||
try {
|
|
||||||
await this.cache.flush();
|
|
||||||
console.log('Cache cleared successfully');
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error clearing cache:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper methods
|
// Helper methods
|
||||||
private getYesterdayDate(): string {
|
private getYesterdayDate(): string {
|
||||||
const yesterday = new Date();
|
const yesterday = new Date();
|
||||||
|
|||||||
@@ -1,39 +1,28 @@
|
|||||||
import { env } from '$env/dynamic/private';
|
import { RedisClient } from 'bun';
|
||||||
import { createClient } from 'redis';
|
|
||||||
|
|
||||||
// Redis client instance
|
// Redis client instance
|
||||||
let redisClient: ReturnType<typeof createClient> | null = null;
|
let redisClient: RedisClient | null = null;
|
||||||
let isConnecting = false;
|
let isConnecting = false;
|
||||||
let isDisconnecting = false;
|
let isDisconnecting = false;
|
||||||
|
|
||||||
export function getRedisClient() {
|
export function getRedisClient() {
|
||||||
const redisUrl = env.REDIS_URL;
|
|
||||||
|
|
||||||
if (!redisClient && !isConnecting) {
|
if (!redisClient && !isConnecting) {
|
||||||
isConnecting = true;
|
isConnecting = true;
|
||||||
redisClient = createClient({
|
redisClient = new RedisClient();
|
||||||
url: redisUrl,
|
|
||||||
});
|
|
||||||
|
|
||||||
redisClient.on('error', (err: any) => {
|
|
||||||
console.error('Redis Client Error:', err);
|
|
||||||
});
|
|
||||||
|
|
||||||
redisClient.on('connect', () => {
|
|
||||||
|
redisClient.onconnect = () => {
|
||||||
console.log('Redis Client Connected');
|
console.log('Redis Client Connected');
|
||||||
isConnecting = false;
|
isConnecting = false;
|
||||||
});
|
}
|
||||||
|
|
||||||
redisClient.on('disconnect', () => {
|
redisClient.onclose = (error: any) => {
|
||||||
console.log('Redis Client Disconnected');
|
console.log('Redis Client Connection Ended', error);
|
||||||
});
|
|
||||||
|
|
||||||
redisClient.on('end', () => {
|
|
||||||
console.log('Redis Client Connection Ended');
|
|
||||||
redisClient = null;
|
redisClient = null;
|
||||||
isConnecting = false;
|
isConnecting = false;
|
||||||
isDisconnecting = false;
|
isDisconnecting = false;
|
||||||
});
|
}
|
||||||
|
|
||||||
redisClient.connect().catch((error) => {
|
redisClient.connect().catch((error) => {
|
||||||
console.error('Redis Client Connection Failed:', error);
|
console.error('Redis Client Connection Failed:', error);
|
||||||
@@ -51,7 +40,7 @@ export async function closeRedisClient(): Promise<void> {
|
|||||||
isDisconnecting = true;
|
isDisconnecting = true;
|
||||||
try {
|
try {
|
||||||
console.log('Closing Redis client connection...');
|
console.log('Closing Redis client connection...');
|
||||||
await redisClient.quit();
|
redisClient.close();
|
||||||
console.log('Redis client connection closed successfully');
|
console.log('Redis client connection closed successfully');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error closing Redis client:', error);
|
console.error('Error closing Redis client:', error);
|
||||||
@@ -70,7 +59,7 @@ export async function forceDisconnectRedis(): Promise<void> {
|
|||||||
isDisconnecting = true;
|
isDisconnecting = true;
|
||||||
try {
|
try {
|
||||||
console.log('Force disconnecting Redis client...');
|
console.log('Force disconnecting Redis client...');
|
||||||
await redisClient.destroy();
|
redisClient.close();
|
||||||
console.log('Redis client force disconnected');
|
console.log('Redis client force disconnected');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error force disconnecting Redis client:', error);
|
console.error('Error force disconnecting Redis client:', error);
|
||||||
@@ -108,7 +97,7 @@ export class CacheManager {
|
|||||||
console.warn('Redis client not available for set operation');
|
console.warn('Redis client not available for set operation');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await client.setEx(key, ttl, JSON.stringify(value));
|
await client.setex(key, ttl, JSON.stringify(value));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Redis set error:', error);
|
console.error('Redis set error:', error);
|
||||||
}
|
}
|
||||||
@@ -135,26 +124,13 @@ export class CacheManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const result = await client.exists(key);
|
const result = await client.exists(key);
|
||||||
return result === 1;
|
return result
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Redis exists error:', error);
|
console.error('Redis exists error:', error);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async flush(): Promise<void> {
|
|
||||||
try {
|
|
||||||
const client = this.client;
|
|
||||||
if (!client) {
|
|
||||||
console.warn('Redis client not available for flush operation');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await client.flushDb();
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Redis flush error:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache key generators
|
// Cache key generators
|
||||||
static getPackageKey(packageName: string, type: string): string {
|
static getPackageKey(packageName: string, type: string): string {
|
||||||
return `pypistats:package:${packageName}:${type}`;
|
return `pypistats:package:${packageName}:${type}`;
|
||||||
@@ -190,7 +166,7 @@ export class LockManager {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const token = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
const token = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
||||||
const result = await client.set(key, token, { NX: true, EX: ttlSeconds });
|
const result = await client.setex(key, ttlSeconds, token);
|
||||||
return result === 'OK' ? token : null;
|
return result === 'OK' ? token : null;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Redis acquireLock error:', error);
|
console.error('Redis acquireLock error:', error);
|
||||||
@@ -216,11 +192,8 @@ export class LockManager {
|
|||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
`;
|
`;
|
||||||
const res = (await client.eval(lua, {
|
const res = await client.send(lua, [key, token]);
|
||||||
keys: [key],
|
return res
|
||||||
arguments: [token]
|
|
||||||
})) as number;
|
|
||||||
return res === 1;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Redis releaseLock error:', error);
|
console.error('Redis releaseLock error:', error);
|
||||||
return false;
|
return false;
|
||||||
@@ -292,7 +265,7 @@ export class SessionManager {
|
|||||||
console.warn('Redis client not available for set session');
|
console.warn('Redis client not available for set session');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await client.setEx(sessionId, this.defaultTTL, JSON.stringify(data));
|
await client.setex(sessionId, this.defaultTTL, JSON.stringify(data));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Set session error:', error);
|
console.error('Set session error:', error);
|
||||||
}
|
}
|
||||||
@@ -335,7 +308,7 @@ export class SessionManager {
|
|||||||
}
|
}
|
||||||
const data = await client.get(sessionId);
|
const data = await client.get(sessionId);
|
||||||
if (data) {
|
if (data) {
|
||||||
await client.setEx(sessionId, this.defaultTTL, data);
|
await client.setex(sessionId, this.defaultTTL, data);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Refresh session error:', error);
|
console.error('Refresh session error:', error);
|
||||||
|
|||||||
Reference in New Issue
Block a user