Nodejs操作缓存数据库-Redis
Hi I’m Shendi
Nodejs专栏
Nodejs操作缓存数据库-Redis
在服务端开发中,缓存数据库也是不可或缺的,可以提高程序并发以及方便后续扩展,而目前最常用的莫过于Redis了
安装依赖
和之前的mysql一样,redis的依赖最常用的就是redis
npm install redis
依赖对应的github地址:https://github.com/redis/node-redis
这是Redis官方给的NodeJS连接指南 https://redis.io/docs/clients/nodejs/
关于 Redis 的安装使用等操作可以看这篇文章:https://sdpro.top/blog/html/article/1023.html
连接示例
下面是官方的示例代码
import { createClient } from 'redis';const client = createClient();client.on('error', err => console.log('Redis Client Error', err));await client.connect();await client.set('key', 'value');
const value = await client.get('key');
await client.disconnect();
上面的代码连接到 localhost:6379,要连接到其他地址,使用以下格式
redis[s]://[[username][:password]@][host][:port][/db-number]
例如
createClient({url: 'redis://alice:foobared@awesome.redis.server:6380/0'
});
其中 username 账号,password 密码,host主机地址,port端口,db-number使用的数据库下标,默认0
有关更多信息参考文档: client configuration guide
要检查客户端是否已连接并准备好发送命令,请使用client. isReady,它返回一个布尔值。client. isOpen也可用。当客户端的底层套接字打开时,此函数返回true,当它不打开时(例如,当客户端在网络错误后仍在连接或重新连接时),此函数返回false。
库的操作基本上都是异步的,上面使用到 await,那么就需要将当前函数设置为 async 异步,例如
async function test() {await client.connect();
}
因为是异步,就需要我们自行控制错误的处理
这里提一嘴,这里的异步全是返回的Promise,所以可以使用Promise的方式
比起解构赋值,我更喜欢以下方式
var redis = require("redis");
const client = redis.createClient();client.on('error', err => console.log('Redis Client Error', err));await client.connect();await client.set('key', 'value');
const value = await client.get('key');
await client.disconnect();
无需关心连接及连接池
Node_redis自动管理连接,因此无需等待连接或回调。由于Node.js和Redis实际上都是单线程的,除了少数例外,不需要使用多个客户端实例或任何池机制;最常见的例外是,如果您使用Pub/Sub订阅,或者使用流或列表进行阻塞,那么您需要有专门的客户端来接收这些长时间运行的命令。
例如连接一个错误的Redis地址,将会一直进行重连

使用
该库对所有开箱即用的Redis命令都提供了内置支持。这些命令使用原始的Redis命令名(HSET、HGETALL等)和一个更友好的驼峰式版本(hSet、hGetAll等)进行暴露:
// 原始redis命令
await client.HSET('key', 'field', 'value');
await client.HGETALL('key');// 友好的js命令
await client.hSet('key', 'field', 'value');
await client.hGetAll('key');
要指定命令的修饰符,可以使用一个JavaScript对象:
await client.set('key', 'value', {EX: 10,NX: true
});
上面的EX是过期时间,单位秒,NX为true时,当键不存在才会进行设置,更多的参数查阅Redis的使用,可以参考https://sdpro.top/blog/html/article/1023.html
获取的内容将被转换为有用的结构
await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' }
await client.hVals('key'); // ['value1', 'value2']
该库也支持 Buffer:
await client.hSet('key', 'field', Buffer.from('value')); // 'OK'
await client.hGetAll(commandOptions({ returnBuffers: true }),'key'
); // { field: <Buffer 76 61 6c 75 65> }
如果您想运行Node Redis还不支持的命令(还!),请使用.sendCommand():
await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK'
await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2']
事务(Multi/Exec)
通过调用.multi()开始一个事务,然后将您的命令串联起来。完成后,调用.exec(),您将获得一个包含您的结果的数组:
await client.set('another-key', 'another-value');const [setKeyReply, otherKeyValue] = await client.multi().set('key', 'value').get('another-key').exec(); // ['OK', 'another-value']
您也可以通过调用.watch()来监视键。如果任何监视的键发生更改,事务将中止。
要深入了解事务,请查看Isolated Execution Guide.
事件
Node Redis客户端类是一个Nodejs EventEmitter,每次网络状态发生变化时,它都会发出一个事件:
| 名称 | 何时发生 | 监听参数 |
|---|---|---|
connect | 启动与服务器的连接 | No arguments |
ready | 客户端已准备好使用 | No arguments |
end | 连接已关闭(通过.quit()或.disconnect()) | No arguments |
error | 出现错误——通常是网络问题,如 “Socket closed unexpectedly” | (error: Error) |
reconnecting | 客户端正在尝试重新连接到服务器 | No arguments |
sharded-channel-moved | See here | See here |
支持的版本
| 版本 | 是否支持 |
|---|---|
| 7.0.z | ✔️ |
| 6.2.z | ✔️ |
| 6.0.z | ✔️ |
| 5.0.z | ✔️ |
| < 5.0 | ❌ |
Node Redis应该可以与旧版本的Redis一起使用,但它还没有经过完全测试,我们无法提供支持。
我使用的 windows 版本的 redis,目前版本为 3.0.504,暂时没有什么问题
错误解决
连接报错 ErrorReply: ERR wrong number of arguments for ‘auth’ command
这个错误是通过调用 createClient({url : “”}) 出现的,因为redis没有设置账号,只设置了密码,而上面给出的url用户密码都有,我于是去搜索了redis的默认账号,搜到为 default… 但没有设置账户,账号处应该留空
链接设置如下解决
redis://:password@localhost:6379
END
相关文章:
Nodejs操作缓存数据库-Redis
Hi I’m Shendi Nodejs专栏 Nodejs操作缓存数据库-Redis 在服务端开发中,缓存数据库也是不可或缺的,可以提高程序并发以及方便后续扩展,而目前最常用的莫过于Redis了 安装依赖 和之前的mysql一样,redis的依赖最常用的就是redis …...
Springboot项目全局异常处理
1.ErrorCode.java package com.hng.config.exception.error;/*** Author: 郝南过* Description: TODO* Date: 2023/11/14 10:56* Version: 1.0*/ public interface ErrorCode {String getCode();String getMessage(); }2.ErrorEnum.java package com.hng.config.exception.er…...
算法笔记-第七章-栈的应用(未完成)
算法笔记-第七章-栈的应用 栈的基本常识栈的解释一栈的解释二 栈的操作序列合法的出栈序列可能的出栈序列补充知识点 后缀表达式(无优先级) 栈的基本常识 栈(Stack)是只允许在一端进行插入或删除操作的线性表。 栈的解释一 栈的…...
Linux socket编程(3):利用fork实现服务端与多个客户端建立连接
上一节,我们实现了一个客户端/服务端的Socket通信的代码,在这个例子中,客户端连接上服务端后发送一个字符串,而服务端接收到字符串并打印出来后就关闭所有套接字并退出了。 上一节的代码较为简单,在实际的应用中&…...
若依Linux与Docker集群部署
若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…...
20.2 设备树中的 platform 驱动编写
一、设备树下的 platform 驱动 platform 驱动框架分为总线、设备和驱动,总线不需要我们去管理,这个是 Linux 内核提供。在有了设备树的前提下,我们只需要实现 platform_driver 即可。 1. 修改 pinctrl-stm32.c 文件 先复习一下 pinctrl 子系…...
C++实现ransac
目录 一、ransac算法原理 1.1、算法概念 1.2、图解 二、c实现ransac 2.1、设置随机样本和离群点 2.2、随机抽取样本 2.3、内点计算 2.4、更新参数 2.2、完整代码 一、ransac算法原理 1.1、算法概念 随机抽样一致性 (RANSAC) 是一种迭代方法,用于根据一组包…...
DNS域名解析服务
1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址,通过IP 地址实现不同计算机之间的相互通信,每台联网计算机都需要通过I 地址来互相联系和分别,但由于P 地址是由一串容易混淆的数字串构成,人们很难记忆所有计算机的…...
【milkv】2、mpu6050驱动添加及测试
前言 本章介绍mpu6050的驱动添加以及测试。 其中驱动没有采用sdk提供的驱动,一方面需要配置irq,另一方面可以学习下如何通过ko方式添加驱动。 一、参考文章 驱动及测试文件编译流程: https://community.milkv.io/t/risc-v-milk-v-lsm6ds…...
SpringCloud Alibaba(中):服务熔断降级-Sentinel
Sentinel Sentinel是阿里巴巴开源的分布式系统流量防卫防护组件,主要对分布式系统中的流量进行控制、熔断降级等保护操作。Sentinel的目标是成为互联网级别分布式系统的流量防卫防护组件,它与系统的各个部分集成,保护着系统的入口和出口。 …...
模型的训练专题
训练目标在数学上指定了模型应该如何从训练数据中学习和获取能力。训练基础模型的当前现状涉及特定于模型的目标。我们设想,未来基础模型的训练目标将反映两个变化:从系统证据和评估中得出的原则性选择,以及跨数据源和模式提供丰富、可扩展和…...
深入解析 Azure 机器学习平台:架构与组成部分
Azure机器学习平台是Microsoft Azure提供的一种云上机器学习服务,为开发者和数据科学家提供了一个全面且易于使用的环境来创建、训练、部署和管理机器学习模型。本文将对Azure机器学习平台的基本架构和组成部分进行深入解析,帮助读者全面了解该平台的工作…...
使用百度语音识别技术实现文字转语音的Java应用
探讨如何使用百度语音识别技术将文字转换为语音的Java应用。百度语音识别技术是一种强大的语音识别服务,可以将输入的文字转换为自然流畅的语音输出。我们将使用Java编程语言来实现这个应用,并提供相应的源代码。 首先,我们需要准备一些前提…...
【C#学习】文件操作
文章目录 常见操作拷贝文件检测文件夹是否存在并创建判断文件是否存在删除文件夹下的所有文件保留文件夹获取指定目录下的所有文件名删除 常见操作 拷贝文件 System.IO.File.Copy(sourcePath, targetPath); 检测文件夹是否存在并创建 //if directory not exit,then establis…...
Chrome版本对应Selenium版本
1.获得浏览器版本号和驱动 浏览器版本: 119.0.6045.124 浏览器驱动版本: 119.0.6043.1 / 120.0.6051.0 访问 https://vikyd.github.io/download-chromium-history-version/ 2. 安装selenium pip install selenium4.1.1 -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted…...
Day29力扣打卡
打卡记录 美丽塔 II(前后缀分解 单调栈) 链接 大佬的题解 class Solution:def maximumSumOfHeights(self, a: List[int]) -> int:n len(a)suf [0] * (n 1)st [n] # 哨兵s 0for i in range(n - 1, -1, -1):x a[i]while len(st) > 1 and …...
java源码用到的设计模式
Java 中有许多常用的设计模式,它们是为了解决特定问题而被反复使用和验证的经验总结。以下是一些常见的 Java 设计模式: 创建型模式 工厂模式 (Factory Pattern): 提供一个创建对象的接口,但是由子类决定实例化哪个类。例如:java…...
high perfermance computer usage
简单记一下hpc的使用: hpc就是一些科研机构或者大学建立的服务器中心。我这大学的每一位学生,可以轻松使用hpc批量跑数据,也可以新建自己的server跑一些local data,后者每个学生账号最大是32核512G的运行内存,体验非常…...
51单片机+DS1302设计一个电子钟(LCD1602显示时间)
一、前言 电子钟是一种能够准确显示时间的设备,广泛应用于家庭、办公场所和公共场所,为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟,使用DS1302作为RTC时钟芯片,LCD1602作为显示屏,并通过串…...
vue项目中在scss代码中使用data中的变量
尽管在日常开发中,这类情况实际上很少出现。 VUE2: 在HTML中使用时,请确保将cssVars绑定在需要使用CSS变量的元素或该元素的上层元素上。 <template><div :style"cssVars"><div class"test"/></div><…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
