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><…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...