• node-redis模块需要注意的事项


    node之中连接redis使用的redis模块,虽然好用,但是有些地方还是需要注意。

    npm install redis

    redis client 行为:
    1、客户端执行过程中断网的情况
      由于原本连接正常,断网后socket无法主动检测到,因此TCP进入不断的重传,ubuntu系统大概在1000秒左右返回ETIMEOUT。
      由于redis客户端没有等待回复超时时间,所以会等待到TCP超时才最终导致超时。
    2、重连接机制:当服务端异常断开会导致重连接,而若是客户端主动断开则不会重连接
      如下两种情况表示客户端主动断开:
        1)向服务端发送quit命令
        2)调用客户端类的end函数
      重连接选项:
        max_attempts:重试次数,默认无限制
        retry_max_delay:两次重连接之间有一个延迟,默认按照指数避退原则不断增加,这个数值设置延迟的最大值
        connect_timeout:连接的超时时间(包括重连接),也就是若设置这个参数,达到这个值后就不会重连接(在这个时间内会按照重连接规则进行多次尝试,直到时间用尽)
    3、设置client.stream.setTimeout这种方式,对于不断向服务器发送命令的应用无效
      因为sock的timeout表示空闲超时,只有在发送与接收都没有数据时才计入空闲时间,
      而由于应用不断向服务端发送命令,也就是在发送上是处于忙状态,不能记录为空闲。

    4、关于end事件
      使用redisClient.quit()向服务端发送quit命令,服务端关闭连接,redis客户端能够收到end事件通知。
      使用redisClient.end()函数主动关闭连接时,redis客户端不会收到end事件通知。
      原因:
        redisClient.end()函数体中有一条语句
        this.stream._events = {}; //将socket连接上注册的所有事件清空
        由于redisClient上的事件是基于socket事件的,当socket事件清空后,redisClient本身也就无法触发任何事件了。
        延伸:socket的end事件触发时机:当读取到一个EOF时触发,因此若没有注册data事件(监控数据可读),也就不会有end事件。
        socket的close在被关闭时触发,因此只要不是极端的清除所有的注册事件,都可以收到该事件通知。
    5、关于redisClient的命令队列与离线队列
      命令队列offline_queue:
      当前连接可用时客户端会将命令不断发出去,每出去一个在队列末尾添加一项,收到一个回复从队列头部删除一项。因此当应用使用多个连接时可能会出现,A连接执行set命令,B连接去查询为空,那是由于A连接上的set命令还在队列里等待redis执行。
      长度查询:client.command_queue.length
      离线队列offline_queue:
      当前连接不可用时,客户端会将命令放置到离线队列之中,同时重连接规则尝试连接服务器,每次尝试失败都会清空离线队列。
      长度查询:client.offline_queue.length
      可使用enable_offline_queue:false选项关闭该功能。
    6、错误时的回调
      若在执行命令中设置了回调函数,当有异常时这个回调会先被调用,然后触发error事件。

  • 相关阅读:
    centos 7修改时间为中国时间
    颜色表及html代码
    前端日志监控体系
    测试开发必备技能:安全测试漏洞靶场实战
    Jmeter(三)----win10系统下如何修改Jmeter字体大小?
    Jmeter(二) ---Jmeter英文版本修改为中文
    Jmeter(一) ---Windows环境搭建
    跟着高手学复盘_初步理解
    小测试对 HTTP/2 的了解
    软件测试入坑建议
  • 原文地址:https://www.cnblogs.com/chang290/p/3601674.html
Copyright © 2020-2023  润新知