Miao-Yunzai/src/init/redis.ts

72 lines
2.0 KiB
TypeScript
Raw Normal View History

2024-06-15 09:27:19 +08:00
import cfg from '../config/config.js'
import { execAsync, sleep } from '../utils/common.js'
import { createClient } from 'redis'
/**
* redis客户端
* @returns
*/
async function redisInit() {
const rc = cfg.redis
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 execAsync(cmd)
await sleep(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 as any
logger.info('Redis 连接成功')
return client
}
/**
*
* @returns
*/
async function aarch64() {
if (process.platform == 'win32') return ''
return await execAsync('uname -m').then(async arch => {
if (arch.stdout && arch.stdout.includes('aarch64')) {
/** 判断redis版本 */
let v = await execAsync('redis-server -v')
if (v.stdout) {
const data = v.stdout.match(/v=(\d)./)
/** 忽略arm警告 */
if (data && Number(data[1]) >= 6) {
return ' --ignore-warnings ARM64-COW-BUG'
}
}
}
return ''
})
}
await redisInit()