| |
| |
| import Redis from 'ioredis'; |
|
|
| let redis: Redis | null = null; |
|
|
| try { |
| |
| redis = new Redis({ |
| maxRetriesPerRequest: 1, |
| retryStrategy: (times) => { |
| if (times > 3) return null; |
| return 200; |
| } |
| }); |
| |
| redis.on('error', (err) => { |
| |
| redis = null; |
| }); |
| } catch (e) { |
| redis = null; |
| } |
|
|
| const memoryCache = new Map<string, { data: any, expiry: number }>(); |
|
|
| export async function getCachedResult(url: string) { |
| if (redis) { |
| try { |
| const cached = await redis.get(`lg:${url}`); |
| if (cached) return JSON.parse(cached); |
| } catch (e) {} |
| } |
|
|
| const mem = memoryCache.get(url); |
| if (mem && mem.expiry > Date.now()) { |
| return mem.data; |
| } |
| return null; |
| } |
|
|
| export async function setCachedResult(url: string, data: any) { |
| const TTL = 24 * 60 * 60; |
|
|
| if (redis) { |
| try { |
| await redis.set(`lg:${url}`, JSON.stringify(data), 'EX', TTL); |
| } catch (e) {} |
| } |
|
|
| memoryCache.set(url, { |
| data, |
| expiry: Date.now() + (TTL * 1000) |
| }); |
| } |
|
|