فهرست منبع

Implement redis tests for nodejs

Zane Kansil 10 سال پیش
والد
کامیت
ffff905b37

+ 21 - 0
frameworks/JavaScript/nodejs/benchmark_config.json

@@ -103,6 +103,27 @@
       "display_name": "nodejs",
       "notes": "",
       "versus": "nodejs"
+    },
+    "redis": {
+      "setup_file": "setup",
+      "db_url": "/hiredis/db",
+      "query_url": "/hiredis/queries?queries=",
+      "update_url": "/hiredis/updates?queries=",
+      "fortune_url": "/hiredis/fortunes",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Redis",
+      "framework": "nodejs",
+      "language": "JavaScript",
+      "orm": "full",
+      "platform": "nodejs",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "nodejs",
+      "notes": "",
+      "versus": "nodejs"
     }
   }]
 }

+ 108 - 0
frameworks/JavaScript/nodejs/handlers/redis.js

@@ -0,0 +1,108 @@
+var h = require('../helper');
+var async = require('async');
+// "If hiredis is installed, node_redis will use it by default.
+// Otherwise, a pure JavaScript parser will be used."
+// >> hiredis is installed for these tests
+var redis = require('redis');
+var client = redis.createClient();
+
+client.on('error', function (err) {
+  console.log('Redis Error: ' + err);
+});
+
+function redisWorldId(id) {
+  return 'world:' + id;
+}
+
+function redisRandomWorld(callback) {
+  var id = h.randomTfbNumber();
+  var redisId = redisWorldId(id);
+  client.get(redisId, function (err, worldValue) {
+    if (err) { throw err; }
+    callback(err, {
+      id: id,
+      randomNumber: worldValue
+    })
+  });
+}
+
+function redisSetWorld(world, callback) {
+  var redisId = redisWorldId(world.id);
+  client.set(redisId, world.randomNumber, function (err, result) {
+    if (err) { throw err; }
+    callback(err, world);
+  });
+}
+
+function redisGetAllFortunes(callback) {
+  client.lrange('fortunes', 0, -1, function (err, fortuneMessages) {
+    if (err) { throw err; }
+
+    var fortunes = fortuneMessages.map(function (e, i) {
+      return { id: i + 1, message: e }
+    });
+
+    callback(err, fortunes)
+  });
+}
+
+
+module.exports = {
+  
+  SingleQuery: function(req, res) {
+    redisRandomWorld(function (err, world) {
+      if (err) { throw err; }
+      h.addTfbHeaders(res, 'json');
+      res.end(JSON.stringify(world));
+    })
+  },
+
+  MultipleQueries: function(queries, req, res) {
+    var queryFunctions = h.fillArray(redisRandomWorld, queries);
+
+    async.parallel(queryFunctions, function (err, worlds) {
+      if (err) { throw err; }
+      h.addTfbHeaders(res, 'json');
+      res.end(JSON.stringify(worlds));
+    })
+  },
+
+  Fortunes: function(req, res) {
+    redisGetAllFortunes(function (err, fortunes) {
+      if (err) { throw err; }
+      h.addTfbHeaders(res, 'html');
+      fortunes.push(h.ADDITIONAL_FORTUNE);
+      fortunes.sort(function (a, b) {
+        return a.message.localeCompare(b.message);
+      })
+      res.end(h.fortunesTemplate({
+        fortunes: fortunes
+      }));
+    });
+  },
+
+  Updates: function(queries, req, res) {
+    var getFunctions = h.fillArray(redisRandomWorld, queries);
+
+    async.parallel(getFunctions, function (err, worlds) {
+      if (err) { throw err; }
+      var updateFunctions = [];
+
+      worlds.forEach(function (w) {
+        w.id = h.randomTfbNumber();
+        updateFunctions.push(function (callback) {
+          if (err) { throw err; }
+          return redisSetWorld(w, callback);
+        });
+      });
+
+      async.parallel(updateFunctions, function (err, updated) {
+        if (err) { throw err; }
+        h.addTfbHeaders(res, 'json');
+        res.end(JSON.stringify(updated));
+      });
+    });
+
+  }
+
+};

+ 12 - 2
frameworks/JavaScript/nodejs/hello.js

@@ -11,9 +11,11 @@ var h = require('./helper.js');
 var MongodbRawHandler = require('./handlers/mongodb-raw');
 var MySQLRawHandler = require('./handlers/mysql-raw');
 // Mongoose is a popular Node/MongoDB driver
-var MongooseHandler = require('./handlers/mongoose')
+var MongooseHandler = require('./handlers/mongoose');
 // Sequelize is a popular Node/SQL driver
-var SequelizeHandler = require('./handlers/sequelize')
+var SequelizeHandler = require('./handlers/sequelize');
+// Node's redis package uses the C bindings of the hiredis library
+var HiredisHandler = require('./handlers/redis');
 
 if (cluster.isMaster) {
   // Fork workers.
@@ -52,6 +54,10 @@ if (cluster.isMaster) {
       return MySQLRawHandler.SingleQuery(req, res);
     } else if (route === '/mysql/fortunes') {
       return MySQLRawHandler.Fortunes(req, res);
+    } else if (route === '/hiredis/db') {
+      return HiredisHandler.SingleQuery(req, res);
+    } else if (route === '/hiredis/fortunes') {
+      return HiredisHandler.Fortunes(req, res);
     }
 
     else {
@@ -74,6 +80,10 @@ if (cluster.isMaster) {
         return MySQLRawHandler.MultipleQueries(queries, req, res);
       } else if (route === '/mysql/updates') {
         return MySQLRawHandler.Updates(queries, req, res);
+      } else if (route === '/hiredis/queries') {
+        return HiredisHandler.MultipleQueries(queries, req, res);
+      } else if (route === '/hiredis/updates') {
+        return HiredisHandler.Updates(queries, req, res);
       } else {
         return responses.routeNotImplemented(req, res);
       }

+ 2 - 0
frameworks/JavaScript/nodejs/package.json

@@ -5,9 +5,11 @@
   "dependencies": {
     "async": "0.9.0",
     "handlebars": "^3.0.3",
+    "hiredis": "^0.4.0",
     "mongodb": "2.0.27",
     "mongoose": "4.0.1",
     "mysql": "2.6.2",
+    "redis": "^0.12.1",
     "sequelize": "2.0.6"
   },
   "main": "hello.js"