当前位置: 首页 > news >正文

nodejs操作redis的工具类

const Redis = require("ioredis");async function generateStreamID() {// 生成时间戳(毫秒级)const timestamp = Date.now();// 生成唯一的序列号const sequenceNumber = Math.random() * 1000; // 根据需要生成唯一的序列号// 构建 Stream ID,格式为 timestamp-sequenceNumberconst streamID = `${timestamp}-${sequenceNumber.toFixed(0)}`;return streamID;
}async function putStreamToRedis(redisList, key, data) {for (const config of redisList) {const redis = createRedisConnection(config);try {// 写入数据到 Redisawait 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 {// 写入数据到Redisawait 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 {// 写入数据到Redisfor (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 {// 写入数据到 Redisfor (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);
}

 

相关文章:

nodejs操作redis的工具类

const Redis require("ioredis");async function generateStreamID() {// 生成时间戳&#xff08;毫秒级&#xff09;const timestamp Date.now();// 生成唯一的序列号const sequenceNumber Math.random() * 1000; // 根据需要生成唯一的序列号// 构建 Stream ID&…...

关于wsl2与win11互联互通的问题

首先搞清楚使用场景。我是在win11上写go做后端api&#xff0c;在WSL2 的Linux上写前端页面。 我发现在windows 里写go语言没啥问题&#xff0c;我的后端api部署在win11上。但是在win11上写前端经常会遇到莫名其妙的故障&#xff0c;一会npm包下不来一会说包之间的依赖结构出问题…...

C++ 类型转换

目录 0.前言 1.C语言类型转换 1.1隐式类型转换 1.2显式类型转换 2.C强制类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3.为什么C需要4种强制类型转换 3.1类型转换的多样性需求 3.2提高类型转换的安全性 3.3提供更明确的语义 3.4支持高级编程…...

2024挖漏洞给报酬的网站汇总,兼职副业3天收益2k

文章目录 一、众测平台(国内)二、前沿漏洞研究奖励计划三、行业SRC四、企业应急响应中心-SRC-汇总 1、互联网企业2、生活服务、住宿、购物相关企业3、物流、出行、旅游4、金融相关企业5、视频游戏直播社交娱乐6、教育、问答、知识付费7、泛科技通讯物联网云服务8、安全企业9、其…...

0到1学习Google广告(2):掌握展示位置及排名规则丨出海笔记

大家好, 我是专注谷歌广告和谷歌SEO的谷哥哥哥&#xff0c;感谢出海笔记Alan邀请。今天我们来聊聊广告界的大拿——谷歌广告。在这个数字营销的黄金时代&#xff0c;无论是B2B、B2C还是品牌类客户&#xff0c;谷歌广告都是一个不容忽视的战场。那么&#xff0c;如何在这个战场上…...

MySQL数据库读超时/SELECT查询超时 杂记

本文环境 阿里云RDS MySQL 8.0.34 当客户端向MySQL数据库发送一条SQL之后,由于SQL很慢很慢,它会在什么时候结束呢? 查看 max_execution_time 变量值 mysql> show variables like max_execution_time; --------------------------- | Variable_name | Value | ------…...

docker数据卷:

docker数据卷&#xff1a; 容器和宿主机之间数据共享 容器和宿主机之间数据共享——————挂载卷————容器内的目录和宿主机的目录进行挂载&#xff0c;实现数据文件共享 容器的生命周期有限&#xff0c;一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始…...

【linux】linux中如何通过systemctl来创建和管理服务

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

目录 一、多语言切换&#xff08;需重启&#xff09; 1、配置文件添加Key 2、新增附加属性当前选择语言 3、创建资源文件 4、初始化多语言集合 5、切换多语言并更新配置文件 6、应用程序启动根据配置切换多语言 7、使用 二、多语言切换&#xff08;无需重启&#xff09;…...

UE5学习笔记12-为角色添加蹲下的动作

一、一点说明 1.蹲下使用了ACharacter类中Crouch();函数&#xff0c;函数功能是先检查是否存在运动组件&#xff0c;将bool类型的变量变为true&#xff0c;该变量代表是想要蹲下。 2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图&#xff0c;如果对:1有疑问请搜索C位域 …...

【笔记】Android 多用户模式和用户类型

简介 用户界面&#xff1a;System 》Multiple Users 》 开关多用户模式。 一般是不同用户模式下&#xff0c;有修改Settings应用配置的权限差异&#xff0c;因此需要通过用户类型对功能进行判断限制。 代码 通过UserManager可以获取当前用户的信息。 frameworks/base/core/…...

SQL基础——MySQL的索引

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、概述 介绍 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有一特定值的行&#xff0c;不使用索引&#xff0c;MySQL必须从第一条记录开始读完整个表&…...

【开发语言】面向对象和面向过程开发思路的区别

引入&#xff1a; 我总结了 面向过程的开发语言思路&#xff1a;1.我要干啥&#xff1f;2.怎么才能实现 面向对象的开发语言思路&#xff1a;1.我要研究谁&#xff1f;2.他能干啥 详解&#xff1a; 面向过程的开发语言思路 我要干啥&#xff1f; 在面向过程的开发中&a…...

谷歌账号登录的时候提示被停用,原因是什么,账号还有救吗?该如何处理?

今日早上&#xff0c;有个久违的朋友找到我说&#xff0c;要恢复账号。 他的情况是这样的&#xff1a;7月21日的时候&#xff0c;他发现自己的谷歌账号登录的时候提示活动异常先&#xff0c;需要输入手机号码验证才能恢复账号。但是输入了自己和亲友们的多个手机号码都无法验证…...

数据库复习笔记

写在最前&#xff0c; 写文章的初衷只是为了复习与记录自己的成长&#xff0c;笔者目前水平还有待提高&#xff0c;文章中难免会出现许多问题与错误&#xff0c;文章内容仅供参考&#xff0c;有不足的地方还请大家多多包涵并指正&#xff0c;谢谢~ 第八章 T-SQL程序结构 8.…...

学习STM32(6)-- STM32单片机ADCDAC的应用

1 引 言 深入了解并掌握STM32F103单片机在模拟数字转换&#xff08;ADC&#xff09;和数字模拟转换&#xff08;DAC&#xff09;应用方面的功能和操作。学习如何配置STM32F103的ADC模块&#xff0c;实现模拟信号到数字信号的精确转换&#xff1b;同时&#xff0c;探索DAC模块…...

学习记录第二十五天

wait函数 wait函数是一个系统调用&#xff0c;用于等待一个子进程结束并回收其资源。当父进程调用wait函数时&#xff0c;它会暂停执行&#xff0c;直到至少有一个子进程结束。wait函数的原型如下&#xff1a; #include <sys/types.h> #include <sys/wait.h>pid_…...

C语言:字符串函数strcmp

该函数用于比较两个字符串是否一样。 使用方法如下&#xff1a; #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况&#xff0c;小于零时返回-1&#xff0c;等于零&#xff0c;大于零时返回1printf("%d\n", strcmp("…...

【数据分析---偏企业】 Excel操作

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Excel操作前 必看 Python 初阶 Python—语言基础与…...

Ajax-01.原生方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...