Spaces:
Sleeping
Sleeping
import cfg from "./config.js" | |
import { createClient } from "redis" | |
import { exec } from "node:child_process" | |
/** | |
* 初始化全局redis客户端 | |
*/ | |
export default async function redisInit() { | |
const rc = cfg.redis | |
if (!rc?.open) return | |
const redisUn = rc.username || "" | |
let redisPw = rc.password ? `:${rc.password}` : "" | |
if (rc.username || rc.password) | |
redisPw += "@" | |
const redisUrl = `redis://${redisUn}${redisPw}${rc.host}:${rc.port}/${rc.db}` | |
let client = createClient({ url: redisUrl }) | |
try { | |
logger.info(`正在连接 ${logger.blue(redisUrl)}`) | |
await client.connect() | |
} catch (err) { | |
logger.error(`Redis 错误:${logger.red(err)}`) | |
const cmd = "redis-server --save 900 1 --save 300 10 --daemonize yes" + await aarch64() | |
logger.info("正在启动 Redis...") | |
await execSync(cmd) | |
await new Promise((resolve) => setTimeout(resolve, 1000)) | |
try { | |
client = createClient({ url: redisUrl }) | |
await client.connect() | |
} catch (err) { | |
logger.error(`Redis 错误:${logger.red(err)}`) | |
logger.error(`请先启动 Redis:${logger.blue(cmd)}`) | |
process.exit() | |
} | |
} | |
client.on("error", async err => { | |
logger.error(`Redis 错误:${logger.red(err)}`) | |
const cmd = "redis-server --save 900 1 --save 300 10 --daemonize yes" + await aarch64() | |
logger.error(`请先启动 Redis:${cmd}`) | |
process.exit() | |
}) | |
/** 全局变量 redis */ | |
global.redis = client | |
logger.info("Redis 连接成功") | |
return client | |
} | |
async function aarch64() { | |
if (process.platform == "win32") | |
return "" | |
/** 判断arch */ | |
const arch = await execSync("uname -m") | |
if (arch.stdout && arch.stdout.includes("aarch64")) { | |
/** 判断redis版本 */ | |
let v = await execSync("redis-server -v") | |
if (v.stdout) { | |
v = v.stdout.match(/v=(\d)./) | |
/** 忽略arm警告 */ | |
if (v && v[1] >= 6) | |
return " --ignore-warnings ARM64-COW-BUG" | |
} | |
} | |
return "" | |
} | |
function execSync (cmd) { | |
return new Promise((resolve, reject) => { | |
exec(cmd, (error, stdout, stderr) => { | |
resolve({ error, stdout, stderr }) | |
}) | |
}) | |
} |