ab测试nodejs比.net响应慢,怎么解
情况说明: 局域网内,服务器是组装机,windows server2008,windows版redis,vmware安装centos6.7 c#直接运行在server上,没做特别配置,nodejs运行在虚拟机,启动参数如下 pm2 start app.js -i 3 代码说明: c# 使用 ServiceStack.Redis 操作redis
public class RSClazz
{
public long Id { get; set; }
public int ClazzId { get; set; }
public int Spare { get; set; }
}
public static string Buy(int userId, int clazzId)
{
try
{
using (var redisClient = RedisManager.GetClient())
{
var rsClazz = redisClient.GetTypedClient<RSClazz>();
var rsOrder = redisClient.GetTypedClient<RSOrder>();
using (rsClazz.AcquireLock())
{
var clazz = rsClazz.GetAll().Where(c => c.ClazzId == clazzId).SingleOrDefault();
if (clazz == null) return "错误请求";
if (clazz.Spare == 0) return "班级名额已满";
}
catch
{
return "失败";
}
}
大概就是这样的意思,前线写入100左右的班级,班级的Spare都是0,所以请求到的都是“班级名额已满”
function(){
exports.buy2 = function(req, res, next){
var mobile = req.params.m
var specid = req.params.s
if(mobile.length != 11 || specid.length != 24){
return res.json({result: -1, mesg: '无效请求'})
}
var key_spare = 'spare:' + specid
client.get(key_spare,function(err, reply){
if(err) {
console.log(err)
}else{
if(reply <= 0){
return res.json({result:0, msg:'没名额了', err:null, debug_msg:'redis名额为空'})
}
else{
async.waterfall([
...
}
nodejs类似的,前期先写入spare:122这样格式的key,value都是0,所以返回的也都是没有名额了
部署好后,使用ab分别请求,结果是访问iis的-c 1000左右每秒可以完成1000+的请求,而nodejs只能完成700左右,试过多次,无论怎么调整ab的参数,nodejs的响应总比c#低不少,唯一的好处是服务器资源占用没c#那么高
接触nodejs时间不长,不知道是不是代码有什么问题,或是有疏漏的地方,请大家帮忙看看,转nodejs就是听说他效率高,并发好,如果只是这样的表现,还不如多加几台服务器,继续用c#,唉~~~