/**
 * ioredis客户端模块
 * @date 2022-03
 * @author 何华东
 */

import { logger } from "mslib";
import { Container } from "typescript-ioc";
const IORedis = require("ioredis");

let config = Container.getValue('config.ioredis');

/**
 * redis客户端实例,基于ioredis插件
 * 
 * 如果typescript-ioc有注册配置config.ioredis，那么会自动创建该实例，否则为空
 * 
 * 配置参考插件ioredis
 */
export let redisClient = null;

if (config) {
    redisClient = new IORedis(Object.assign({
        /**
            https://www.npmjs.com/package/ioredis
            默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
            将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
         */
        maxRetriesPerRequest: 0,
        //懒连接
        lazyConnect: true,
        //关闭离线队列
        enableOfflineQueue: false
    }, config));

    redisClient.on("error", error => {
        //服务器连接失败,会频繁触发异常
        if (error.code === 'ECONNREFUSED') return;
        logger.error(error);
    });
}