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> <!-…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
