redis模块和ioredis的注意事项

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.rhkb.cn/news/400951.html

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

相关文章

LeetCode之回溯

1.全排列 1.1 题目 1.2 题解 LeetCode 力扣官方题解 1.3 代码 class Solution {public List<List<Integer>> permute(int[] nums) {// 创建一个空的列表 res&#xff0c;用于存储所有的排列结果List<List<Integer>> res new ArrayList<>();/…

练习题PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

突破长度限制 使用usort上传后门 usort — 使用用户自定义的比较函数对数组中的值进行排序 paramusort(...$GET); ...为php设置可变长参数 在url地址栏中输入[]test&1[]phpinfo();&2assert 包含了phpiinfo&#xff08;&#xff09;命令执行 结合usort使用 assert…

SpringMVC快速入门

MVC模式 MVC&#xff08;Model-View-Controller&#xff09;模式是一种设计模式&#xff0c;用于分离应用程序的不同方面&#xff0c;以提高代码的组织性和可维护性。在Spring MVC框架中&#xff0c;MVC模式的作用是将应用程序的不同职责分开&#xff0c;从而简化开发和维护过…

Datawhale X 魔搭 AI夏令营第四期 AIGC方向 task02笔记

AI工具使用 1. baseline 代码2. 使用通义千问理解代码2.1 工作流程2.2 逐行释意 3. 使用通义千问生成 Prompt3.1 生成的 Prompt3.1 根据 Prompt 生成的图片 1. baseline 代码 !pip install simple-aesthetics-predictor!pip install -v -e data-juicer!pip uninstall pytorch-…

EasyBoss ERP上线TikTok热销数据功能,助力TikTok本土店卖家快速选品上货!

想要你的TikTok本土小店销量不断增长&#xff0c;选品至关重要。只有选品问题解决了&#xff0c;后续的投放、小店定调等动作才有意义。 因此&#xff0c;今天就来分享几种TikTok本土小店的选品策略。 一、TikTok Shop选品的底层逻辑 图源&#xff1a;TikTok Shop 在选品之前…

SpringBoot 自定义 starter

1. 官方文档 SpringBoot 版本 2.6.13&#xff0c;相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…

C++哪些变量在没有显式初始化的情况下会被初始化为0

首先&#xff0c;我们需要明白C程序编译链接后会包含以下几个主要段(Section)。 代码段(.text)&#xff1a;存放程序的可执行代码&#xff0c;通常是只读的数据段(.data)&#xff1a;存放已初始化的全局变量和静态变量BSS段(.bss)&#xff1a;存放未初始化的全局变量和静态变量…

Git文件管理技巧:轻松删除与查看文件,忽略不必要的文件与文件夹!

避免文件混乱&#xff1a;Git 文件操作技巧 一、Git工作原理概述二、删除文件三、查看指定文件的修改四、指定不需要 Git 管理的文件五、总结 一、Git工作原理概述 Git是一种分布式版本控制系统&#xff0c;其核心在于其高效的快照机制、强大的分支与合并功能、本地开发的灵活…

详细分析JWT的基本知识(附Demo)

目录 前言1. 基本知识2. JWT验证过程3. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 紧凑的、U…

《Kotlin核心编程》2021版复习记录

目录 0 前言1 基础语法1.1 数据类型1.2 数组1.3 集合1.4 遍历数据和集合1.5 函数声明返回值类型1.6 var 和 val 2 高阶函数和lambda表达式2.1 高阶函数2.2 方法和成员引用2.3 链式调用2.4 扩展函数2.5 面向表达式编程2.5.1 when表达式2.5.2 for循环2.5.3 in 2.6 字符串相等 3 面…

手撕初阶数据结构之---排序

1.排序概念及运用 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下&#xff0c;就是大的在前面&#xff…

被老韭菜阴阳了?未来一个人最核心的能力:守脑如玉——早读(逆天打工人爬取热门微信文章解读)

tomato 版本TO&#xff1f; 引言Python 代码第一篇 洞见 未来一个人最核心的能力&#xff1a;守脑如玉第二篇 股友见闻结尾 &#xff08;你看出本质了吗&#xff1f;&#xff09; 引言 昨晚听别人的分析 好神奇 我会惊叹 为什么大家看到的都是同样的东西 而别人进行思考 思考…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求&#xff0c;特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符&#xff0c;PDF中的条码可以包含各种类型的信息&#xff0c;如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包&#xff0c;提供了丰富的功能和简洁易用的界面&#xff0c;使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸&#xff0c;勾选多人脸模式即可 人脸替换 高清修复自…

SPDK源码剖析一hello_world程序

SPDK初识之hello_world程序分析 首先是hello_world程序整体框架分析 int main(int argc, char **argv) {rc parse_args(argc, argv, &opts);if (spdk_env_init(&opts) < 0) { // spdk环境初始化&#xff0c;最终调用dpdk环境初始化}// 扫描设备&#xff0c;将驱…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求&#xff1a; 可用的 httpd 服务器&#xff08;如 Apache、Zeus、IIS 等&#xff09; PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…