1
10import { Redis } from "ioredis";
11import { getLogger } from "../logger.js";
12
13const log = getLogger("redis");
14
15let shared: Redis | null = null;
16
17export function createRedis(url: string): Redis {
18 const redis = new Redis(url, {
19 maxRetriesPerRequest: null,
20 lazyConnect: false,
21 enableReadyCheck: true,
22 retryStrategy: (times) => Math.min(times * 200, 5000)
23 });
24
25 redis.on("error", (err: Error) => {
26 log.warn({ err: err.message }, "redis connection error (auto-retrying)");
27 });
28 redis.on("connect", () => log.debug("redis connected"));
29 redis.on("ready", () => log.debug("redis ready"));
30 redis.on("reconnecting", (ms: number) => log.warn(`redis reconnecting in ${ms}ms`));
31 return redis;
32}
33
34
35export function getRedis(url: string): Redis {
36 if (!shared) shared = createRedis(url);
37 return shared;
38}
39
40export async function closeRedis(): Promise<void> {
41 if (shared) {
42 await shared.quit().catch(() => shared!.disconnect());
43 shared = null;
44 }
45}
46