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事件。

node-redis模块需要注意的事项的更多相关文章

  1. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  2. Node.js模块

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...

  3. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  4. 编写原生Node.js模块

    导语:当Javascript的性能需要优化,或者需要增强Javascript能力的时候,就需要依赖native模块来实现了. 应用场景 日常工作中,我们经常需要将原生的Node.js模块做为依赖并在项 ...

  5. 编写原生的Node.js模块

    导语:当Javascript的性能遭遇瓶颈,或者需要增强Javascript能力的时候,就需要依赖native模块来实现了. 应用场景 日常工作中,我们经常需要将原生的Node.js模块做为依赖并在项 ...

  6. Node.js 模块

    稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...

  7. python redis模块的常见的几个类 Redis 、StricRedis和ConnectionPool

    日常写代码过程中,经常需要连接redis进行操作.下面我就介绍下python操作redis模块redis中的几个常见类,包括redis连接池. 一.StrictRedis 类 请看代码:. #!/us ...

  8. nginx/php的redis模块扩展

    redis模块介绍 redis2-nginx-module 可以实现 Nginx 以非阻塞方式直接防问远方的 Redis 服务,可以启用强大的 Redis 连接池功能,进而实现更多的连接与更快速的访问 ...

  9. node基础—模块系统

    模块的概念 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统. 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node ...

随机推荐

  1. static 与 extern 关键字描述说明

    使用static 定义的变量和函数只能用于本模块即为本文件 使用extern 定义的变量和函数可以用于其他模块的引用

  2. Linux enca命令

    一.简介 enca是Linux下的文件编码转换工具. 二.安装 http://dl.cihar.com/enca/   http://www.2cto.com/os/201404/295528.htm ...

  3. java同一个类中,构造器如何调用另一个重载的构造器?

    构造器里面调用其它构造器,格式方法如下:1.使用this调用另一个重载构造器,只能在构造器中使用:2.必须写在构造器执行体的第一行语句: 示例如下: import static java.lang.S ...

  4. 利率计算v2.0--web版--软件工程

    .客户说:帮我开发一个复利计算软件. .如果按照单利计算,本息又是多少呢? .假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多少呢? .利率这么低,复利计算 ...

  5. 想成为一名成功的UX设计师吗?做好这13件事情吧

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 丢掉那些阻碍你前进的东西 每个人对成功的定义都不同.如果想在重要事情上取得成功,学会给予才是关键.只 ...

  6. Oracle GoldenGate 四、数据过滤和数据项匹配

    写在开始前 从两周前我花了大量的业余时间阅读GoldenGate官方文档,并根据文档实践和进一步学习了解GoldenGate,以下便是根据官方文档理解总结的GoldenGate学习内容: Oracle ...

  7. C# Redis Server分布式缓存编程(二)(转)

    出处;http://www.cnblogs.com/davidgu/p/3263485.html 在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Red ...

  8. java并发编程实战:第十四章----构建自定义的同步工具

    一.状态依赖性管理 对于单线程程序,某个条件为假,那么这个条件将永远无法成真 在并发程序中,基于状态的条件可能会由于其他线程的操作而改变 可阻塞的状态依赖操作的结构 acquire lock on o ...

  9. (3)-JSONObject的过滤设置

    我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的类:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  10. linux中执行java或者mvn命令提示没有权限解决办法

    $ chmod a+x /var/jenkins_home/jdk1.8.0_191/bin/java $ chmod a+x /var/jenkins_home/apache-maven-3.3.9 ...