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-movedSee hereSee 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/175147.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

466. 回文日期

题目&#xff1a; 466. 回文日期 - AcWing题库 思路&#xff1a; 1.如果正向考虑&#xff0c;计算两天之间所以的回文数&#xff0c;应该如何枚举&#xff1f;没有明确的进制&#xff0c;那么只能列一个日历&#xff0c;这样会比较麻烦。 2.我们不妨采用逆向思维&#xff0…

智慧隧道:TSINGSEE青犀远程视频AI智能监管平台保障隧道施工安全

一、背景与需求分析 随着我国交通运输量的增加以及新基建的不断规划和建设&#xff0c;公路建设工作也在持续开展中。高速公路隧道属于特殊构造段&#xff0c;因为隧道空间小&#xff0c;密闭性强&#xff0c;施工过程中一旦发生火灾、事故等&#xff0c;将带来重大人员伤亡和…

Eclipse打包Springboot项目

首先&#xff0c;在pom.xml文件中添加配置&#xff0c;修改mainClass主函数&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configurat…

代驾预约小程序系统源码 :提起预约,避免排队 带完整搭建教程

大家好啊&#xff0c;又到罗峰来给大家分享好用的源码系统的时间了。今天要给大家分享的第一款代驾预约小程序源码系统。传统的代驾服务中&#xff0c;用户往往需要在酒后代驾、长途驾驶等场景下&#xff0c;面对排队等待代驾司机空闲时间的繁琐过程。这不仅浪费了用户的时间和…

大数据知识图谱项目——基于知识图谱的电影问答系统(超详细讲解及源码)

大数据知识图谱项目——基于知识图谱的电影问答系统&#xff08;超详细讲解及源码&#xff09; 一、项目概述 知识图谱是将知识连接起来形成的一个网络。由节点和边组成&#xff0c;节点是实体&#xff0c;边是两个实体的关系&#xff0c;节点和边都可以有属性。知识图谱除了…

解决:element ui表格表头自定义输入框单元格el-input不能输入问题

表格表头如图所示&#xff0c;有 40-45&#xff0c;45-50 数据&#xff0c;且以输入框形式呈现&#xff0c;现想修改其数据或点击右侧加号增加新数据编辑。结果不能输入&#xff0c;部分代码如下 <template v-if"columnData.length > 0"><el-table-colu…

「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(一)

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天&#xff0c;周&#xff0c;月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

【数据结构】树与二叉树(十六):二叉树的基础操作:插入结点(算法Insert)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

Python机器学习、深度学习提升气象、海洋、水文领域实践应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

科学上网导致Adobe软件运行弹出This non-genuine Adobe app will be disabled soon,尝试解决办法

之前介绍用防火墙拦截Adobe软件的出站规则可以解决软件的非正版弹窗&#xff0c;但是有的用户却不行是为什么&#xff0c;原因是使用了代理网络。因为Adobe此时跑的不是本地的流量而是代理的流量。所以防火墙拦截就不起作用了。 首先是之前介绍过的拦截方法&#xff0c;如果你没…

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

java轮播图接口实现

一. 内容简介 实现java后端用户管理接口&#xff0c;数据库使用msyql。 二. 软件环境 2.1 java 1.8 2.2 mysql Ver 8.0.13 for Win64 on x86_64 (MySQL Community Server - GPL) 2.3 IDEA ULTIMATE 2019.3 2.4d代码地址 https://gitee.com/JJW_1601897441/competitionAs…