百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

适用于Node.js的健壮、注重性能的全功能Redis客户端——ioredis

wptr33 2024-12-18 17:31 38 浏览

介绍

ioredis是一个适用于Nodejs的Redis全功能客户端,健壮性以及高性能是它的亮点,支持Redis> = 2.6.12和(Node.js> = 6),ioredis是一个功能强大的功能强大的Redis客户,已被阿里巴巴和许多其他了不起的公司所使用。







Github

https://github.com/luin/ioredis

特性

  • 功能齐全。它支持Cluster,Sentinel,Pipelining,当然还支持Lua脚本和Pub / Sub(具有二进制消息的支持)
  • 高性能
  • 易于使用的API。它与Node回调和本机Promise一起使用
  • 命令参数和回复的转换
  • 透明键前缀
  • Lua脚本的抽象,允许您定义自定义命令
  • 支持二进制数据
  • 支持TLS
  • 支持脱机队列和就绪检查
  • 支持ES6类型,例如Map和Set
  • 支持GEO命令(Redis 3.2不稳定)
  • 复杂的错误处理策略
  • 支持NAT映射
  • 安装

    npm install ioredis

    基本使用

    var Redis = require("ioredis");
    var redis = new Redis();
    
    redis.set("foo", "bar");
    redis.get("foo", function(err, result) {
     console.log(result);
    });
    redis.del("foo");
    
    // 或者如果最后一个参数不是函数,则使用Promise
    redis.get("foo").then(function(result) {
     console.log(result);
    });
    
    
    redis.sadd("set", 1, 3, 5, 7);
    redis.sadd("set", [1, 3, 5, 7]);
    
    // 所有参数都直接传递给redis服务器:
    redis.set("key", 100, "EX", 10);

    连接到Redis

    创建新的Redis实例后,将同时创建到Redis的连接。可以通过以下方式指定要连接的Redis:

    new Redis(); // Connect to 127.0.0.1:6379
    new Redis(6380); // 127.0.0.1:6380
    new Redis(6379, "192.168.1.1"); // 192.168.1.1:6379
    new Redis("/tmp/redis.sock");
    new Redis({
     port: 6379, // Redis port
     host: "127.0.0.1", // Redis host
     family: 4, // 4 (IPv4) or 6 (IPv6)
     password: "auth",
     db: 0
    });

    使用TLS加密时,还可以将连接选项指定为redis:// URL或rediss:// URL:

    new Redis("redis://:authpassword@127.0.0.1:6380/4");

    发布/订阅

    这是发布/订阅API的简单示例。以下程序将打开两个客户端连接。它订阅一个连接的频道,然后发布另一个连接:

    var Redis = require("ioredis");
    var redis = new Redis();
    var pub = new Redis();
    redis.subscribe("news", "music", function(err, count) {
     // 现在我们都订阅了“新闻”和“音乐”频道。
     // `count` 代表我们当前订阅的频道数。
    
     pub.publish("news", "Hello world!");
     pub.publish("music", "Hello again!");
    });
    
    redis.on("message", function(channel, message) {
     // 从新闻频道,收到消息Hello world!
     // 从音乐频道再次收到消息Hello!
     console.log("Receive message %s from channel %s", message, channel);
    });
    
    //还有一个称为“ messageBuffer”的事件,与“ message”相同,除了//返回缓冲区buffer而不是字符串。
    redis.on("messageBuffer", function(channel, message) {
     
    });

    还以类似方式支持PSUBSCRIBE:

    redis.psubscribe("pat?ern", function(err, count) {});
    redis.on("pmessage", function(pattern, channel, message) {});
    redis.on("pmessageBuffer", function(pattern, channel, message) {});

    当客户端发出SUBSCRIBE或PSUBSCRIBE时,该连接将进入“订阅者”模式。那时,只有修改订阅集的命令才有效。当订阅集为空时,连接将恢复为常规模式。如果需要在订阅者模式下向Redis发送常规命令,只需打开另一个连接即可。

    处理二进制数据

    redis.set("foo", Buffer.from("bar"));

    每个命令都有一个返回Buffer的方法(通过在命令名后添加“ Buffer”后缀)。获取缓冲区buffer:

    redis.getBuffer("foo", function(err, result) {
     // result is a buffer.
    });

    Pipelining

    如果要发送一批命令(例如> 5),则可以使用流水线将命令在内存中排队,然后将它们一次全部发送到Redis。这样,性能提高了50%?300%。redis.pipeline()创建一个Pipeline实例。您可以像Redis实例一样在其上调用任何Redis命令。这些命令在内存中排队,并通过调用exec方法刷新到Redis:

    var pipeline = redis.pipeline();
    pipeline.set("foo", "bar");
    pipeline.del("cc");
    pipeline.exec(function(err, results) {
     
    });
    
    
    redis
     .pipeline()
     .set("foo", "bar")
     .del("cc")
     .exec(function(err, results) {});
    
    
    var promise = redis
     .pipeline()
     .set("foo", "bar")
     .get("foo")
     .exec();
    promise.then(function(result) {
    });

    每个链接的命令还可以具有一个回调,该回调将在命令得到答复时被调用:

    redis
     .pipeline()
     .set("foo", "bar")
     .get("foo", function(err, result) {
     // result === 'bar'
     })
     .exec(function(err, result) {
     // result[1][1] === 'bar'
     });

    除了将命令分别添加到管道队列之外,还可以将命令和参数数组传递给构造函数:

    redis.pipeline([["set", "foo", "bar"], ["get", "foo"]]).exec(function() {
     /* ... */
    });

    length属性显示管道中有多少个命令:

    const length = redis
     .pipeline()
     .set("foo", "bar")
     .get("foo").length;
    // length === 2

    。。。。。。

    以上是借鉴Github上介绍的部分功能,如果需要详细了解它的所有功能,则可以直接参考Github上提供的文档API,非常详细,本文篇幅有限就不在此展示!

    https://github.com/luin/ioredis

    Redis可视化客户端

    之前的文章中介绍了很多Redis的可视化管理客户端,今天就在介绍一个跨平台的Redis GUI——Medis。Medis是一个漂亮的,易于使用的Redis管理应用程序,它基于Electron,React和Redux构建在现代网络上。它由许多很棒的Node.js模块提供支持,尤其是ioredis和ssh2。







    特性:

  • 按键查看/编辑
  • SSH隧道,用于连接远程服务器
  • 执行自定义命令的终端
  • 配置查看/编辑
  • 高级:

  • JSON / MessagePack格式查看/编辑和内置高亮显示/验证
  • 在不阻止Redis服务器的情况下使用数百万个键和键成员
  • 模式管理器,可轻松选择子键组。
  • https://github.com/luin/medis

    总结

    如果你正愁在Nodejs下没有找到一个好用的Redis客户端,那么ioredis则是你可以选择的一个选项,好不好用还得试试才知道,Enjoy it!

    相关推荐

    oracle数据导入导出_oracle数据导入导出工具

    关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

    继续学习Python中的while true/break语句

    上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

    python continue和break的区别_python中break语句和continue语句的区别

    python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

    简单学Python——关键字6——break和continue

    Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

    2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

    用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

    Python 中 break 和 continue 傻傻分不清

    大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

    python中的流程控制语句:continue、break 和 return使用方法

    Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

    L017:continue和break - 教程文案

    continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

    作为前端开发者,你都经历过怎样的面试?

    已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

    面试被问 const 是否不可变?这样回答才显功底

    作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

    2023金九银十必看前端面试题!2w字精品!

    导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

    前端面试总结_前端面试题整理

    记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

    由浅入深,66条JavaScript面试知识点(七)

    作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

    2024前端面试真题之—VUE篇_前端面试题vue2020及答案

    添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

    今年最常见的前端面试题,你会做几道?

    在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...