redis模块和ioredis的注意事项

news2024/11/27 10:36:54

redis模块和ioredis的注意事项


文章目录

  • redis模块和ioredis的注意事项
  • 前言
  • 一、ioredis和redis使用zrange的比较
  • 二、出现zrange结果不同的原因
  • 总结


前言

node.js在使用redis的时候有两个库可以选择,一个是redis、另一个是ioredis,我一直以来也没有太大关注这两个库有什么区别。直到今天写代码的时候发现一个令我困惑的问题。


一、ioredis和redis使用zrange的比较

有个需求,需要将任务按优先级进行排序,在redis是有一个有序集合的api:zadd可以直接完成这个功能的。在zadd中主要通过参数priority来完成数据的自动排序,排序规则是,priority的值越小,score越小,代码如下:

const Redis = require('ioredis');
const redis1 = new Redis();

// 使用 zadd 命令
async function addToSortedSet() {
    try {
        const result = await redis1.zadd('mySortedSet', 1, 'value1');
        const result1 = await redis1.zadd('mySortedSet', 3, 'value12');
    } catch (err) {
        console.error('Error adding to sorted set:', err);
    }
}

addToSortedSet();

然后取数据

const result = await redis1.zrange('manager_processing', 0, 0);
console.log('取出result:', result);   //正常返回接结果

打印结果

在这里插入图片描述

这一切都没有什么问题,很正常。


BUT, 当我们用redis模块来实现时,问题就来了

const Redis = require('redis');
var client = Redis.createClient(6379,'127.0.0.1'); //端口号、主机

// 使用 zadd 命令
async function addToSortedSet() {
    try {
        const result = await client.zadd('mySortedSet', 1, 'value4');
        const result1 = await client.zadd('mySortedSet', 3, 'value5');
    } catch (err) {
        console.error('Error adding to sorted set:', err);
    }
}

addToSortedSet();

可以看出redis模块实现插入数据是没有问题的,如下图,数据成功插入。
在这里插入图片描述
但是当我们去取数据的时候,注意:

 try {
     const result = await client.zrange('manager_processing', 0, 0);
     console.log('取出result:', result);   //结果是true or flase
 }catch (e) {
     console.log(e);
 }

在这里插入图片描述
**返回结果竟然是false!!!!!!!**这是为什么???卖个关子,我们在下一节给出解释。

二、出现zrange结果不同的原因

redis (redis.createClient)

  • redis 库创建的 client 是基于回调的 Redis 客户端。要使用 await 关键字,它必须返回一个 Promise。redis 库的 zrange 方法是基于回调的,不直接支持 Promise。
  • client.zrange 中,虽然你使用了 await,但由于 client.zrange 返回的是回调模式的函数,这会导致 TypeError,因为 await 不能用于非 Promise 对象。

ioredis (new Redis())

  • ioredis 库创建的 redis1 客户端支持 Promise,所以可以直接使用 await 来处理异步操作。
  • redis1.zrange 调用将正确返回 Promise 的结果,并可以被 await 使用。

明白了把,在redis模块中,redis的库的 zrange 方法是基于回调的,不直接支持 Promise,他不能使用await去获取返回值哦,原来真正的罪魁祸首是,redis的库是基于回调的,不支持promise。

找出原因,这下我们就可以修改redis的代码了:

const Redis = require('ioredis');
const redis1 = new Redis();
var redis = require('redis');
var client = redis.createClient(6379,'127.0.0.1'); //端口号、主机

async function testZrange() {
    client.zrange('manager_processing', 0, 0, (err, result)=> {
        if (err) {
            console.log(err);
        } else {
            console.log(result);
        }
    });
}

这样我们就可以取到结果了。完美解决。

当然还有另一种用法:

const result = await new Promise((resolve, reject) => {
    redisClient.zrange(manager_processing, 0, 0, (err, result) => {
        if (err) {
            reject(err);
        } else {
            resolve(result);
        }
    });
});

以上两种方法大家可以根据自己需求去选择使用。


总结

  • redis 库创建的 client 是基于回调的 Redis 客户端。要使用 await 关键字,它必须返回一个 Promise。redis 库的 zrange 方法是基于回调的,不直接支持 Promise。

  • ioredis 库创建的 redis1 客户端支持 Promise,所以可以直接使用 await 来处理异步操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小红书js逆向x-s之补环境

请求参数分析 数据文件在homefeed里,直接复制header参数在Convert curl commands 生成python代码跑一下 (注意curlconverter生成的respond的输入参数里有一个是json,这个是不对的,需要改为data) 结果发现报错&…

netcore-https证书配置

一、新建项目:WebHtpsDemo 二、生成pfx证书 拷贝到项目中 三、修改配置文件appsettings.Development.json {"KestrelSettings": {"IP": "192.168.31.68","Port": 8189,"CerPath": "xxxCert.pfx",&qu…

“艾”公益——微笑行动「文山站」为艾祝福,让笑起舞

艾多美“微笑行动”文山站拉开帷幕 此次爱心帮助71名唇腭裂患儿 重新绽放微笑 ♥ ♥ ♥ 不让笑容留有缺憾 每个孩子都有微笑的权利 艾多美向唇腭裂儿童伸出援手 绽放笑容,拥抱全新的未来 2024年8月6日-8月12日,云南省文山康复医院迎来了艾多美--微笑行动…

C语言典型例题35

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.3 有一函数&#xff1a;y{-1&#xff08;x<0&#xff09;;0(x0);1(x>0);编程序&#xff0c;要求输入一个x值后&#xff0c;输出y值。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff…

PaddleOCR 图片文字提取

PaddleOCR 图片文字提取 需求一.裁剪车牌号码区域二.对车牌小图进行处理三.填充边界四.识别步骤 需求 工作上的一个需求&#xff0c;需要把图片中的车牌号码提取出来。如图&#xff0c;车牌在图片固定位置。开始使用pytesseract&#xff0c;对中文识别特别不友好&#xff0c;毕…

19116 丑数

### 计划 1. **输入处理**&#xff1a;读取输入的正整数 T 和 T 行的正整数 n。 2. **生成丑数**&#xff1a;使用最小堆&#xff08;优先队列&#xff09;生成丑数&#xff0c;确保每次取出的数都是当前最小的丑数。 3. **存储丑数**&#xff1a;将生成的丑数存储在一个数组中…

IO网络编程

思维导图 作业一&#xff1a;使用wasd控制机械臂 #include<myhead.h> #include <termios.h> #define SER_PORT 8888 //与服务器保持一致 #define SER_IP "192.168.0.103" //服务器ip地址 #define CLI_PORT 6666 //客户端…

【网络】TCP拥塞窗口(第六篇)

拥塞窗口&#xff08;Congestion Window&#xff0c;简称cwnd&#xff09;是TCP协议中用于防止网络拥塞的一种重要机制。它是在发送端采用的一种“拥塞避免”算法和“慢速启动”算法相结合的机制&#xff0c;用于控制发送端向网络中注入的数据量&#xff0c;从而避免网络拥塞。…

MySQL数据库介绍及基础操作

目录&#xff1a; 一.数据库介绍 二.数据库分类 三. 数据库的操作 四. 常用数据类型 五. 表的操作 一.数据库介绍 1.文件保存数据有以下几个缺点: 1.1文件的安全性问题 1.2文件不利于数据查询和管理 1.3文件不利于存储海量数据 1.4文件在程序中控制不方便 为了解决上述问题&…

python爬取B站视频实验

实验17&#xff1a;爬虫2 文章目录 实验17&#xff1a;爬虫21.实验目标及要求2. 实验主要内容3.实验小结 1.实验目标及要求 &#xff08;1&#xff09;掌握有关爬虫的包 &#xff08;2&#xff09;掌握爬虫方法 &#xff08;3&#xff09;爬取B站卡塔尔世界杯若干视频 2. 实验…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

【开端】一个看的奇奇怪怪类的解析

一、绪论 Java中正常的类语法如下&#xff1a; public class TmpMUser implements Serializable{ Data public class TmpMUser implements Serializable{/*** 序列*/private static final long serialVersionUID 1L;/*** */private String rowId;/*** */private String …

贪心算法篇--代码随想录算法训练营第二十七天| 134. 加油站,135. 分发糖果,860.柠檬水找零

134. 加油站 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 贪心算法&#xff0c;得这么加油才能跑完全程&#xff01;LeetCode &#xff1a;134.加油站 题目描述&#xff1a; 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加…

如何设置 Visual Studio Code 的滚轮缩放功能

Visual Studio Code (VSCode) 是一个强大的代码编辑器&#xff0c;提供了许多便捷的功能来提高开发效率。其中之一就是通过滚轮缩放字体大小。以下是详细的设置步骤&#xff1a; 步骤 1&#xff1a;打开设置页面 首先&#xff0c;启动 Visual Studio Code。在左上角点击 “文…

【网红时代】揭秘网红IP分析与打造,专业自媒体运营攻略

在这个互联网高速发展的时代&#xff0c;网红IP和自媒体的影响力日益凸显&#xff0c;成为品牌传播和市场营销的重要力量。如何分析和打造网红IP&#xff0c;进行专业的自媒体运营&#xff0c;成为许多企业和个人关注的焦点。今天&#xff0c;让我们一起探索网红IP的奥秘&#…

2024高端网站制作公司推荐TOP3

2024这个数字化高度发达的时间段&#xff0c;一个专业、高端的网站不仅是企业形象的展示窗口&#xff0c;更是连接用户与品牌的重要桥梁。 随着技术的不断进步和设计理念的不断创新&#xff0c;许多高端网站制作公司凭借其卓越的技术实力、创新的设计理念和丰富的项目经验&…

逻辑判断1-逻辑基础知识

目录 一、命题1.命题介绍2.复合命题1. 联合命题(且)2. 选言命题(或者、要么)3. 假言命题(如果、才、否则)3.模态命题(可能必然)4.直言命题(所有有些)5.充分必要条件二、推理方式一、命题 1.命题介绍 命题的四种形式和关系 命题传递规则 A→B,B→C,可联立,得出A→…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…

请求转发与重定向

一、介绍 设想这样一种情况&#xff0c;在我们登录某个网站时&#xff0c;登录页面会要求我们输入账号密码以及其他信息&#xff0c;当我们点击登录按钮时&#xff0c;浏览器会将我们的信息以及请求的一些信息发送到服务器端&#xff0c;在服务器端&#xff0c;我们可以从requ…

haralyzer 半自动,一次性少量数据采集快捷方法

使用场景&#xff1a;半自动&#xff0c;一次性少量数据采集需求在工作中还是不少遇到的&#xff0c;无论使用模拟的方式&#xff0c;或者破解都不太划算。其实这种需求&#xff0c;使用半自动爬虫是最简单的。不需要考虑网站反爬虫的问题&#xff0c;因为你使用的就是真实的浏…