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);
}