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() {// 生成时间戳(毫秒级)const timestamp Date.now();// 生成唯一的序列号const sequenceNumber Math.random() * 1000; // 根据需要生成唯一的序列号// 构建 Stream ID&…...
关于wsl2与win11互联互通的问题
首先搞清楚使用场景。我是在win11上写go做后端api,在WSL2 的Linux上写前端页面。 我发现在windows 里写go语言没啥问题,我的后端api部署在win11上。但是在win11上写前端经常会遇到莫名其妙的故障,一会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的谷哥哥哥,感谢出海笔记Alan邀请。今天我们来聊聊广告界的大拿——谷歌广告。在这个数字营销的黄金时代,无论是B2B、B2C还是品牌类客户,谷歌广告都是一个不容忽视的战场。那么,如何在这个战场上…...
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数据卷: 容器和宿主机之间数据共享 容器和宿主机之间数据共享——————挂载卷————容器内的目录和宿主机的目录进行挂载,实现数据文件共享 容器的生命周期有限,一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始…...
【linux】linux中如何通过systemctl来创建和管理服务
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
WPF-实现多语言的静态(需重启)与动态切换(不用重启)
目录 一、多语言切换(需重启) 1、配置文件添加Key 2、新增附加属性当前选择语言 3、创建资源文件 4、初始化多语言集合 5、切换多语言并更新配置文件 6、应用程序启动根据配置切换多语言 7、使用 二、多语言切换(无需重启)…...
UE5学习笔记12-为角色添加蹲下的动作
一、一点说明 1.蹲下使用了ACharacter类中Crouch();函数,函数功能是先检查是否存在运动组件,将bool类型的变量变为true,该变量代表是想要蹲下。 2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图,如果对:1有疑问请搜索C位域 …...
【笔记】Android 多用户模式和用户类型
简介 用户界面:System 》Multiple Users 》 开关多用户模式。 一般是不同用户模式下,有修改Settings应用配置的权限差异,因此需要通过用户类型对功能进行判断限制。 代码 通过UserManager可以获取当前用户的信息。 frameworks/base/core/…...
SQL基础——MySQL的索引
简介:个人学习分享,如有错误,欢迎批评指正。 一、概述 介绍 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表&…...
【开发语言】面向对象和面向过程开发思路的区别
引入: 我总结了 面向过程的开发语言思路:1.我要干啥?2.怎么才能实现 面向对象的开发语言思路:1.我要研究谁?2.他能干啥 详解: 面向过程的开发语言思路 我要干啥? 在面向过程的开发中&a…...
谷歌账号登录的时候提示被停用,原因是什么,账号还有救吗?该如何处理?
今日早上,有个久违的朋友找到我说,要恢复账号。 他的情况是这样的:7月21日的时候,他发现自己的谷歌账号登录的时候提示活动异常先,需要输入手机号码验证才能恢复账号。但是输入了自己和亲友们的多个手机号码都无法验证…...
数据库复习笔记
写在最前, 写文章的初衷只是为了复习与记录自己的成长,笔者目前水平还有待提高,文章中难免会出现许多问题与错误,文章内容仅供参考,有不足的地方还请大家多多包涵并指正,谢谢~ 第八章 T-SQL程序结构 8.…...
学习STM32(6)-- STM32单片机ADCDAC的应用
1 引 言 深入了解并掌握STM32F103单片机在模拟数字转换(ADC)和数字模拟转换(DAC)应用方面的功能和操作。学习如何配置STM32F103的ADC模块,实现模拟信号到数字信号的精确转换;同时,探索DAC模块…...
学习记录第二十五天
wait函数 wait函数是一个系统调用,用于等待一个子进程结束并回收其资源。当父进程调用wait函数时,它会暂停执行,直到至少有一个子进程结束。wait函数的原型如下: #include <sys/types.h> #include <sys/wait.h>pid_…...
C语言:字符串函数strcmp
该函数用于比较两个字符串是否一样。 使用方法如下: #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况,小于零时返回-1,等于零,大于零时返回1printf("%d\n", strcmp("…...
【数据分析---偏企业】 Excel操作
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 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> <!-…...
厘米级实景复刻 全域化镜像感知:自进化时空标定技术加持,筑牢复杂工况视频孪生运行根基
厘米级实景复刻 全域化镜像感知副标题:自进化时空标定技术加持,筑牢复杂工况视频孪生运行根基前言数字孪生技术规模化落地进程中,实景还原精度不足、全域感知连贯性薄弱、复杂工况适配性差成为制约行业发展的核心瓶颈。传统方案受限于静态标定…...
HEIF Utility终极指南:如何在Windows上免费打开和转换苹果HEIF照片
HEIF Utility终极指南:如何在Windows上免费打开和转换苹果HEIF照片 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 还在为iPhone照片在Windows电脑上…...
手机号定位终极指南:3分钟搭建免费归属地查询系统
手机号定位终极指南:3分钟搭建免费归属地查询系统 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/…...
从零到一:在Visual Studio中集成海康机器人工业相机SDK的完整指南
1. 环境准备:搭建开发基础 第一次接触工业相机开发时,我也被各种专业术语和配置步骤搞得头晕眼花。后来发现只要把环境搭建好,后面的开发就会顺利很多。咱们先从最基础的软件安装开始,就像盖房子要先打地基一样。 Visual Studio的…...
深入解析XXD2212电调:从PWM信号到三相驱动的实战指南
1. XXD2212电调初探:你的无刷电机控制中枢 第一次拿到XXD2212电调时,我差点把它当成了普通的舵机控制器——它们的外形实在太像了。这块巴掌大的电路板实际上是一个精密的能量转换中枢,负责将微控制器的PWM信号转化为三相无刷电机能理解的语言…...
Python爬虫实战:手把手教你如何采集开源许可证 FAQ 文章归档!
㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐ (中级) 🉐福利: 一次订阅后,专栏内的所有文章…...
1、Chrome Elements面板:从入门到精通的网页调试实战指南
1. Chrome Elements面板:你的网页调试瑞士军刀 第一次打开Chrome开发者工具时,那个标着"Elements"的标签页看起来就像是一堆杂乱无章的HTML代码。但当我真正开始理解它的功能后,它迅速成为了我每天使用最频繁的开发工具。Elements面…...
开源中间件IoTDM:破解物联网数据孤岛,实现异构设备统一管理
1. 项目概述:开源中间件如何成为物联网的“粘合剂”在物联网(IoT)领域摸爬滚打了十几年,我见过太多“数据孤岛”的困境。智能家居、工业传感器、可穿戴设备……每个设备、每个平台都像一座座信息孤岛,数据格式五花八门…...
AI应用开发模板:基于FastAPI与LangChain的Agent后端快速构建指南
1. 项目概述:一个为AI应用开发者准备的“开箱即用”大脑最近在折腾AI应用开发的朋友,可能都经历过类似的痛苦:想快速验证一个想法,比如做个智能客服、文档问答机器人,或者一个能理解你指令的自动化工具。结果发现&…...
3个步骤掌握微信聊天记录导出:让珍贵对话永不丢失的实用方法 [特殊字符]
3个步骤掌握微信聊天记录导出:让珍贵对话永不丢失的实用方法 📱 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…...
