nodejs处理高并发问题
做了一个nodejs并发测试,先描述一下环境 数据库mysql,大概两张表,读取第一张表test的数据,拿出来-1,存到第二张testlog表记录一下,用jmeter同事模拟50个请求,结果发现,部分数据没有-1成功
test 表数据
id num desc
1 94 2017-02-28 14:41:17:86
testlog 表数据
id, testid, num, desc
4 1 99 2017-02-28 14:32:42:28
5 1 98 2017-02-28 14:32:43:76
6 1 97 2017-02-28 14:32:44:89
7 1 97 2017-02-28 14:32:44:88
8 1 97 2017-02-28 14:32:44:28
9 1 97 2017-02-28 14:32:44:86
10 1 97 2017-02-28 14:32:44:45
11 1 97 2017-02-28 14:32:45:48
12 1 97 2017-02-28 14:32:45:49
推测可能是同时修改数据,某一个现在没有修改完毕,下一个线程已经读取过了,导致数据更新不一致,但是nodejs不都是单线程的吗,请各位大神解析一下,谢谢
代码如下
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function (req, res) {
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
res.end("OK");
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'myData'
});
connection.connect();
connection.query('SELECT * from test', function (err, rows, fields) {
if (err) {
console.log(err);
return;
};
var test = rows[0]; //读取num
var num = test.num - 1;
var id = test.id;
connection.query("update test set num=" + num + ",`desc`='" + dateFormat(new Date()) + "'", function (err, res) {
if (!err) {
var insert = "insert into testlog(testid,num,`desc`) values ('" + id + "','" + num + "','" + dateFormat(new Date()) + "')";
connection.query(insert, function (err, res) {
if (!err) {
connection.end();
console.log("update sucess!");
} else {
console.log(err);
}
});
} else {
connection.end();
console.log(err);
}
});
});
function dateFormat(date) {
var fmt = "yyyy-MM-dd hh:mm:ss:SS";
var o = {
"M+": date.getMonth() + 1, //??
"d+": date.getDate(), //?
"h+": date.getHours(), //С?
"m+": date.getMinutes(), //?
"s+": date.getSeconds(), //?
"q+": Math.floor((date.getMonth() + 3) / 3), //??
"S+": date.getMilliseconds() //?ī
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return fmt;
}
}).listen(3000);
nodejs处理高并发问题的更多相关文章
- nodejs 单线程 高并发
nodejs为什么是单线程且支持高并发的脚本语言呢? 1.node的优点:I/O密集型处理(node的I/O请求都是异步的,如:sql查询.文件流操作.http请求……):异步I/O?顾名思义就是异步 ...
- Nodejs 高并发长链接TCP链接的服务器设计问题
最近有个项目比较棘手,nodejs的tcp服务,目前的服务器支持3W左右的客户端连接,但是客户希望能够支持30W左右,原先的模型是让客户端请求一个地址分发服务器,然后再tcp链接到不同的地址上实现高并 ...
- NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储
返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...
- nodejs高并发大流量的设计实现,控制并发的三种方法
nodejs高并发大流量的设计实现,控制并发的三种方法eventproxy.async.mapLimit.async.queue控制并发Node.js是建立在Google V8 JavaScript引 ...
- Nodejs:单线程为什么能支持高并发?
1.Nodejs是一个平台,构建在chrome的V8上(js语言解释器),采用事件驱动.非阻塞模型( c++库:libuv). 参考官方: Node.js is a platform built ...
- 既然nodejs是单线程的,那么它怎么处理多请求高并发的?
单线程解决高并发的思路就是采用非阻塞,异步编程的思想.简单概括就是当遇到非常耗时的IO操作时,采用非阻塞的方式,继续执行后面的代码,并且进入事件循环,当IO操作完成时,程序会被通知IO操作已经完成.主 ...
- 使用ngx_lua构建高并发应用(1)
转自:http://blog.csdn.net/chosen0ne/article/details/7304192 一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apa ...
- NodeJs06 高并发
高并发架构 在业务的最初期,由于业务和用户的体量比较小,可能采用单机就足够了.随着业务的增长,用户量和并发请求量都会不断上升.当增长到一定的瓶颈的时候,系统能否抗住压力,就需要采取一些方案了.这就是著 ...
- 高并发&高可用系统的常见应对策略
解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...
随机推荐
- C#利用VFW实现摄像头程序
最近在搞这个考试监控,找来VFW的资料,胡编乱凑而成. VFW全称为Video for Windows,是微软提供的,内嵌windows系统. 首先定义一个VideoAPI类. 首先调用avicap3 ...
- 实用JS系列——BOM常用对象
背景: 最近在着手项目的时候,意识到自己JS的欠缺.虽然看了不少JavaScript的视频,但真正项目中并不是经常遇到大且难的例子.所以JavaScript的基础还需要再打扎实,也就有了这一系列博客 ...
- Zigzag数组 -- 面试宝典
最近在看面试宝典,其中看到一个题目说:输入一个正整数n,输出它的zigzag数组. 分析:书上给出了数学方面的思考然后给了代码.但是我感觉如果真是面试或者考试遇到的话,我这种笨脑袋肯定是想不出来的,因 ...
- BZOJ1233 [Usaco2009Open]干草堆tower 【单调队列优化dp】
题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 ...
- Gcd反应堆 (pgcd)
Gcd反应堆 (pgcd) 题目描述 不知什么时候起,TA突然对gcd产生了浓厚的兴趣,于是他为此编写了个程序,输入分别不大于m,n (1<m,n<=10^7)的两个数,就能得出gcd(m ...
- TestNG测试执行顺序
1.preserve-order属性,之前一直认为preserve-order属性是控制配置方法的执行顺序的,其实不是,preserve-order主要是控制test下节点classes执行顺序的 例 ...
- 转:ListView中getView的工作原理
ListView中getView的工作原理: [1]ListView asks adapter “give me a view” (getView) for each item of the list ...
- Redis为什么单进程单线程也那么快
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- php命名空间与可变函数
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决 对于命名空间,官方文档已经说得很详细[查看],我在 ...
- 限制MYSQL从服务器为只读状态
修改全局变量的方法有两种,第一种是修改配置文件,第二种是SQL语句设置全局变量的值.(可以参考:http://www.cnblogs.com/qlqwjy/p/8046592.html) 0.简介: ...