Skip to content

Instantly share code, notes, and snippets.

@sergi
Last active December 20, 2015 05:29
Show Gist options
  • Save sergi/6078939 to your computer and use it in GitHub Desktop.
Save sergi/6078939 to your computer and use it in GitHub Desktop.
Naive redis GET/SET server for Node.js.
// Try with `redis-benchmark -t GET,SET -n 100000`
'use strict';
var net = require('net');
var split = require('split');
var db = {};
net.createServer(function(socket) {
function sendError(err) {
console.error(err);
socket.write("-ERR " + err + "\r\n")
}
function execute(cmdArgs) {
var name = cmdArgs[0];
var first = cmdArgs[1];
if (name === 'GET') {
if (cmdArgs.length < 1) {
sendError("GET expects 1 argument");
return;
}
socket.write('$' + db[first].length + '\r\n' + first + '\r\n');
}
else if (name === 'SET') {
if (cmdArgs.length < 2) {
sendError("SET expects 2 arguments");
return;
}
db[first] = cmdArgs[1];
socket.write('+OK\r\n');
}
else {
sendError("Unknown command: #" + name + "#");
}
}
var waitForCmd = false;
var argc = 0;
var args = [];
socket
.pipe(split())
.on('data', function(line) {
if (waitForCmd) {
waitForCmd = false;
args.push(line);
argc -= 1;
if (argc === 0) {
execute(args);
args = [];
}
return;
}
if (!line) return;
if (line.charAt(0) === '*') {
argc = parseInt(line.substr(1));
return;
}
else if (argc > 0 && line.charAt(0)=== '$') {
waitForCmd = true;
}
else {
sendError('Unexpected operation "' + line + '"')
}
});
socket.on('error', function(e) { console.log(e) });
}).listen(6379);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment