Node.js~ioredis处理耗时请求时连接数瀑增
关于redis连接数过高的解释
对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用连接数,默认为1万)不够用的情况,一般的提示如下:
It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail
在redis-cli上输入info命令也可以进行查看
aaarticlea/png;base64,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" alt="" />
redis-server.conf里配置了它默认的最大连接数
maxclients 10000
产生它的原因有几个:
- 单个请求使用结果后,没有释放,client.end()没有使用,这主要是redis组件
- 而使用了ioredis组件后,需要redis会自动释放,但时机也是http请求结束之后才执行,所以对于长时间没有响应的请求,也会出现占用redis线程的问题,解决方法手动使用redis.quit()即可
- 单个请求时间过长,导师redis连接一直被一个请求占用,而在请求数过多时,这种现象就会引用连接池不够用
- 多线程环境下(非node.js),使用了实例模块,而没有使用单例模式,因为很多redis驱动是支持多路复用的
大叔建议的作法:
减少单次请求的响应时间,建议把redis从一个大请求中拿出来,因为纯redis还是很快的
正确使用redis组件,用完就关了
正确理解多线程与socket连接,要知道socket连接直接影响你的服务器CPU性能
ioredis代码实例
ioredis是个好东西,它完全支持了redis的cluster,sentinal等新技术
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
})
同时支持标准的字符连接串
// Connect to 127.0.0.1:6380, db 4, using password "authpassword":
new Redis('redis://:authpassword@127.0.0.1:6380/4')
支持发布与订阅,它会存储在进程里,它不会被持久化,所有会有消息丢失的情况
var Redis = require('ioredis');
var redis = new Redis();
var pub = new Redis();
redis.subscribe('news', 'music', function (err, count) {
// Now we are subscribed to both the 'news' and 'music' channels.
// `count` represents the number of channels we are currently subscribed to.
pub.publish('news', 'Hello world!');
pub.publish('music', 'Hello again!');
});
好了,下次我们有时间去讲讲ioredis的具体操作!
感谢各位的阅读!
Node.js~ioredis处理耗时请求时连接数瀑增的更多相关文章
- node.js如何让前端请求时能跨域
1995年,Netscape提出了一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同. 当一个浏览器的两个tab页中分别打开来 百度和谷 ...
- Node.js:GET/POST请求
ylbtech-Node.js:GET/POST请求 1.返回顶部 1. Node.js GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般 ...
- node.js GET与POST请求
node.js GET与POST请求 转 http://www.voidcn.com/article/p-ncglaiqx-bdx.html 标签 get post node.js 栏目 Node.j ...
- Node.js模拟发起http请求从异步转同步的5种方法
使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...
- Node.js:get/post请求、全局对象、工具模块
一.GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交.表单提交到服务器一般都使用 GET/POST 请求. 1.获取GET请求内容 由于GET请求直接被嵌入在路径 ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- node.js 针对不同的请求路径(url) 做出不同的响应
边看这个边写的: http://wenku.baidu.com/link?url=C4yLe-TVH6060u_x4t34H3Ze8tjoL7HjJaKgH-TvHnEYl-T_gAMYwhmrCeM ...
- 【node.js】GET/POST请求、Web 模块
获取GET请求内容 node.js 中 url 模块中的 parse 函数提供了这个功能. var http = require('http'); var url = require('url'); ...
- vue-cli3.0+node.js+axios跨域请求session不一样的问题
一.问题重述 使用的是,前后端分离,前端vue+axios请求,后端使用node搭建服务端接口,遇到的问题是,我通过登录接口吧数据存储型在session,我登录上以后,发现再次验证登录(另一个接口)的 ...
随机推荐
- dubbo的简单实现
一 是什么 一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多,dubbo使前后端分离,完成负载均衡. dubbo架构图 节点角色说明: Provider: 暴露服务的服务提供方 ...
- 关于Union和Union All的区别以及用法
有些时候我们在查询的时候会碰到这么一个问题,就是一条SQL不能查出来你想要的结果;首先,我们必须明确一条查询SQL执行之后数据库会给我们返回什么,他会返回符合条件的一个结果集,而当你一条查询SQL不能 ...
- C#基础语法(一)
一.基础语法 1.C#区分大小写,所以myVar和MyVar是两个不同的变量. 2.每个C#可执行文件(如控制台应用程序,Windows应用程序和Windows服务)都必须有一个入口点----Main ...
- 移动端WEBAPP开发遇到的坑,以及填坑方案!持续更新~~~~
前言:在移动端WEBAPP开发中会遇到各种各样的问题,通过此文对遇到的问题做一个归纳总结,方便自己日后查询,也给各位前端开发友人做一个参考. 此文中涉及的问题是本人开发中遇到的,解决方案是本人思考 ...
- [Python] Spark平台下实现分布式AC自动机(一)
转载请注明出处:http://www.cnblogs.com/kirai/ 作者:Kirai 零.问题的提出 最近希望在分布式平台上实现一个AC自动机,但是如何在这样的分布式平台上表示这样的非线性数据 ...
- 在SQL Server中用好模糊查询指令LIKE
简介:like在sql中的使用 在SQL Server中用好模糊查询指令LIKE 查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇之 ...
- win7下用SSH连接linux虚拟机
本文来自转载:原文 [需求] 在win7环境下用SSH(SecureShell)连接本地的一台虚拟机上ubuntu(11.10)系统 [环境] win7,ubuntu,vmware(8.0) [方案 ...
- view测量
一.测规格是由测量模式mode和测量大小size组成的,size好说,那测量模式mode代表什么含义呢.由上面的代码可知,测量模式有三类: UNSPECIFIED 父控件不对你有任何限制, ...
- 接触响应式-css3-media判断屏幕分辨率
// IE6.7.8不支持css3 使用响应式一般用bootstrap框架(IE8使用时须引用Respond.js)而不用原生JS 外联式: <link type="text/c ...
- lua metatable(元表)
lua metatable (元表) 概述 普通 table 类型的表仅能够做一些单表操作, 无法进行一些特殊的以及两个表的操作, 比如 table1 + table2, print(table3) ...