nodejs操作redis的工具类

const Redis = require("ioredis");

async function generateStreamID() {
    // 生成时间戳(毫秒级)
    const timestamp = Date.now();

    // 生成唯一的序列号
    const sequenceNumber = Math.random() * 1000; // 根据需要生成唯一的序列号

    // 构建 Stream ID,格式为 timestamp-sequenceNumber
    const streamID = `${timestamp}-${sequenceNumber.toFixed(0)}`;

    return streamID;
}

async function putStreamToRedis(redisList, key, data) {
    for (const config of redisList) {
        const redis = createRedisConnection(config);

        try {
            // 写入数据到 Redis
            await redis.del(key);
            // 构建 Stream ID,使用通配符 `*` 代替时间戳和序列号
            const streamID = "*";

            // 构建 XADD 命令的参数
            const args = [key, streamID, ...Object.entries(data).flat()];

            // 执行 XADD 命令
            await redis.xadd(...args);

            console.log("Put data to Redis successfully!");
        } catch (error) {
            console.error(`${config.host}: Redis error - ${error.message}`);
        } finally {
            redis.quit(); // 请使用 quit() 方法关闭连接而不是 close()
        }
    }
}

async function putStringToRedis(redisList, key, value) {
    for (const config of redisList) {
        const redis = createRedisConnection(config);

        try {
            // 写入数据到Redis
            await redis.set(key, value);
            console.log('Put String to Redis successfully!');
        } catch (error) {
            console.error(`Failed to put String to Redis for ${config.host}: ${error.message}`);
        } finally {
            redis.disconnect(); // 关闭 Redis 连接
        }
    }
}

async function putMapToRedis(redisList, map) {
    for (const config of redisList) {
        const redis = createRedisConnection(config);

        try {
            // 写入数据到Redis
            for (const [key, value] of map.entries()) {
                await redis.set(key, value);
            }

            // map.forEach((value,key)=>{
            //   console.log('key'+key+'====value:'+value);
            //   redis.set(key, value);
            // });

            console.log('Put Map to Redis successfully!');
        } catch (error) {
            console.error(`Failed to put Map to Redis for ${config.host}: ${error.message}`);
        } finally {
            redis.disconnect(); // 关闭 Redis 连接
        }
    }
}

async function deleteAllKeysWithPrefix(redisList, prefix) {
    for (const config of redisList) {
        const redis = createRedisConnection(config);

        try {
            const keysToDelete = await redis.keys(`${prefix}*`);
            for (const key of keysToDelete) {
                await redis.del(key);
            }

            console.log('Deleted keys from Redis successfully!');
        } catch (error) {
            console.error(`Failed to delete keys from Redis for ${config.host}: ${error.message}`);
        } finally {
            redis.disconnect();
        }
    }
}

function createRedisConnection(config) {

    let dbIndex = 0; // 默认连接到 db0

    // 检查 dbIndex 是否是数字或字符串
    if (config.dbIndex !== undefined && config.dbIndex !== null) {
        const parsed = parseInt(config.dbIndex, 10); // 将 dbIndex 转换为整数
        if (!isNaN(parsed) && parsed >= 0 && parsed < 16) { // Redis 通常提供 0 到 15 的数据库
            dbIndex = parsed;
        }
    }

    const redisOptions = {
        host: config.host,
        port: config.port,
        // 指定连接的数据库索引
        db: dbIndex, 
        maxRetriesPerRequest:2
    };

    if (config.pwd) {
        redisOptions.password = config.pwd;
    }

    return new Redis(redisOptions);
}

async function publishMessage(config, channel, message) {
    const redis = createRedisConnection(config);

    return new Promise((resolve, reject) => {
        redis.publish(channel, message, (error, result) => {
            // 关闭 Redis 连接
            redis.disconnect();

            if (error) {
                reject(error);
            } else {
                console.log('Message published successfully!');
                resolve(result);
            }
        });
    }).catch((error) => {
        // 处理 Promise 拒绝
        console.error(`Failed to publish message: ${error.message}`);
        throw error; // 重新抛出错误,以防止未处理的 Promise 拒绝警告
    });
}

async function putHashByMap(redisList, dataMap) {
    for (const config of redisList) {
        const redis = createRedisConnection(config);
        console.info("dataMap:"+dataMap);
        try {
            // 写入数据到 Redis
            for (const [key, value] of dataMap.entries()) {
                if (value) {
                    try {
                        const result = await redis.hset(key, value);
                        console.log(`hset result for key ${key}: ${result}`);
                    } catch (error) {
                        console.error(`Failed to hset: ${error.message}`);
                    }
                }
            }
        } catch (error) {
            console.error(`Failed to put hash to Redis: ${error.message}`);
        } finally {
            redis.disconnect(); // 关闭 Redis 连接
        }
    }
}

//判断是否主机
async function isMasterRedis(redisConfig) {
    const redis = createRedisConnection(redisConfig);
    try {
        const info = await redis.info('Replication');
        const role = info.split('\r\n')[1].split(':')[1].trim();
        if (role.toLowerCase() === 'master') {
            console.log(`${redisConfig.host} This Redis instance is a master server.`);
            return true;
        } else {
            console.log(`${redisConfig.host} This Redis instance is not a master server.`);
        }
    } catch (error) {
        console.error(error);
    } finally {
        redis.disconnect();
    }
    return false;
}

//redis执行save命令,生成dump.db
async function saveRedisData(redisList) {
    try {
        for (const config of redisList) {
            const redis = createRedisConnection(config);
            await redis.save();
        } 
    } catch (error) {
        console.error(`Failed to save data to disk. Response: ${error.message}`);
    }
}




module.exports = {
    putStreamToRedis,
    putStringToRedis,
    putMapToRedis,
    deleteAllKeysWithPrefix,
    createRedisConnection,
    publishMessage,
    putHashByMap,
    isMasterRedis,
    saveRedisData
}

redisList参数举例如下:

for (const config of redisList) {
    console.log('Redis Config:');
    console.log('Host:', config.host);
    console.log('Port:', config.port);
    console.log('Password:', config.pwd);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨两点钟同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值