nodejs操作redis

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: nodejs操作redis

前前后后已经写过好多个语言与redis进行结合了,有php,c++,java,今天总算要用nodejs来操作redis了,不知为何还有点儿小兴奋~~

虽然限于nodejs的异步编程模型的影响,直观上和其它语言非常不同,但基本上花一些时间都可以很快的适应,操作redis的方法依然如此,与操作mysql的api没什么两样~

我还是准备着重介绍关于redis的认证,事务和批处理相关的内容,毕竟redis的数据结构本身非常的直观,并没有什么好多讲的~

从官网上可以了解很全面信息,这里面有个小插曲,我的桌面OS是win7 64bit,但是死活安装不好vs环境,导致无法成功编译hiredis,所以只能使用redis提供的javascript接口,这在性能上会有所降低,不过目前这并不是我的关注点。

javascript是基于事件驱动的,nodejs理所当然的也拥有事件驱动引擎,所以先看一下这个redis库提供了哪些重要的事件:

ready

与redis服务创建连接成功后,会触发“ready”事件,这表明服务器端已经准备好接受命令了,但这并不表明必须在该事件发生后才能使用client执行命令,那是因为在“ready”事件触发之前,用client执行的命令会存放在队列中,等到就绪后会根据顺序依次调用命令。

end

当连接关闭后,会触发“end”事件。

drain

当连接缓冲区可写后,会触发“drain”事件,这有助于你控制发送频率。


下面来介绍一些重要的接口:

redis.createClient(port, host, options)

默认port是6379,默认的host当然是127.0.0.1,options为一个对象,可以包含下列的属性:

  • parser: redis协议的解析器,默认是hiredis,如果像我一样悲剧的装不上,那该项会被设置为javascript;
  • no_ready_check: 默认为false,当连接建立后,服务器端可能还处在从磁盘加载数据的loading阶段,这个时候服务器端是不会响应任何命令的,这个时候node_redis会发送INFO命令来检查服务器状态,一旦INFO命令收到响应了,则表明服务器端已经可以提供服务了,此时node_redis会触发“ready”事件,这就是为什么会有“connect”和“ready”事件之分,如果你关闭了这个功能,我觉得会出现一些貌似灵异的问题;
  • enable_offline_queue: 默认为true,前面提到过,当连接ready之前,client会把收到的命令放入队列中等待执行,如果关闭该项,所有ready前的调用都将会立刻得到一个error callback;
  • retry_max_delay: 默认为null,默认情况下client连接失败后会重试,每次重试的时间间隔会翻倍,直到永远,而设置这个值会增加一个阀值,单位为毫秒;
  • connect_timeout: 默认为false,默认情况下客户端将会一直尝试连接,设置该参数可以限制尝试连接的总时间,单位为毫秒;
  • max_attempts: 默认为null,可以设置该参数来限制尝试的总次数;
  • auth_pass: 默认为null,该参数用来认证身份。

client.auth(password, callback)

这个接口用来认证身份的,如果你要连接的redis服务器是需要认证身份的,那么你必须确保这个方法是创建连接后第一个被调用的。需要注意的是,为了让使重连足够的简单,client.auth()保存了密码,用于每次重连后的认证,而回调只有会执行一次哦~~

另外你需要确保的是,千万别自作聪明的把client.auth()放在“ready”或“connect”事件的回调中,你将会得到一行神秘的报错:

Error: Ready check failed: ERR operation not permitted

只需要在redis.createClient()代码后直接调用clietn.auth()即可,具体原因我没有深究~

client.end()

这个方法会强行关闭连接,并不会等待所有的响应。如果不想如此暴力,推荐使用client.quit(),该方法会在收到所有响应后发送QUIT命令。

client.unref()

这个方法作用于底层socket连接,可以在程序没有其他任务后自动退出,可以类比nodejs自己的unref()。这个方法目前是个试验特性,只支持一部分redis协议。

client.multi([commands])

multi命令可以理解为打包,它会把命令都存放在队列里,直到调用exec方法,redis服务器端会一次性原子性的执行所有发来的命令,node_redis接口最终会返回一个Multi对象。

Multi.exec(callback)

client.multi()会返回一个Multi对象,它包含所有的命令,直到调用Multi.exec()。我们来主要说一下这个方法的回调函数中的两个参数:

  • err: null或者Array,没有出错当然就会返回null,如果出错则返回命令队列链中对应的发生错误的命令的错误信息,数组中最后一个元素exec()方法自身的错误信息,这里我要说的是,可以看出这种方式所谓的原子性主要是指的命令链中的命令一定会保证一起在服务器端执行,而不是指的像关系型数据库那样的回滚功能
  • results: null或者Array,返回命令链中每个命令的返回信息。
var redis  = require("./index"),
    client = redis.createClient(), set_size = 20;

client.sadd("bigset", "a member");
client.sadd("bigset", "another member");

while (set_size > 0) {
    client.sadd("bigset", "member " + set_size);
    set_size -= 1;
}

// multi chain with an individual callback
client.multi()
    .scard("bigset")
    .smembers("bigset")
    .keys("*", function (err, replies) {
        // NOTE: code in this callback is NOT atomic
        // this only happens after the the .exec call finishes.
        client.mget(replies, redis.print);
    })
    .dbsize()
    .exec(function (err, replies) {
        console.log("MULTI got " + replies.length + " replies");
        replies.forEach(function (reply, index) {
            console.log("Reply " + index + ": " + reply.toString());
        });
    });
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
109 0
|
2月前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
3月前
|
缓存 NoSQL Redis
redis管道操作(节省网络IO开销)
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。
36 1
|
3月前
|
NoSQL Java Redis
如何在 Java 中操作这些 Redis 数据结构的基本方法
如何在 Java 中操作这些 Redis 数据结构的基本方法
32 2
|
3月前
|
NoSQL 数据管理 关系型数据库
数据管理DMS操作报错合集之控制台查看Redis时出现乱码是什么导致的
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
3月前
|
DataWorks NoSQL Java
DataWorks操作报错合集之数据集成使用公共数据集成资源组写入到redis数据源(使用的是VPC连接),提示以下错误:request action:[InnerVpcGrantVpcInstanceAccessToApp], message:[InvalidInstanceId.怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
存储 NoSQL Go
轻松上手,使用Go语言操作Redis数据库
轻松上手,使用Go语言操作Redis数据库
|
3月前
|
NoSQL Redis
加速 Redis 操作:掌握管道技术提升性能与效率
加速 Redis 操作:掌握管道技术提升性能与效率
|
3月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——列表操作与哈希操作
【Redis】 Java操作客户端命令——列表操作与哈希操作
|
3月前
|
NoSQL Java Linux
【Redis】 使用Java操作Redis的客户端
【Redis】 使用Java操作Redis的客户端