UNPKG

redis-node

Version:

A Complete Redis Client for Node.js

99 lines (89 loc) 2.94 kB
var sys = require('sys'); var connect = require('connect'); var redisFactory = require('./index'); var redis = redisFactory.createClient(); var server = connect.createServer(); // test with: ab -n 5000 -c 40 http://127.0.0.1:3000/folders function buffer_to_strings(x) { for(var i in x) { if (typeof x[i] === "object" || typeof x[i] === "buffer") { var temp = x[i].toString('utf8'); x[i] = temp; } } return x; } // perform asynchronous callbacks for each item in a list and then // pass the new list off to a final callback function map(list, each_callback, final_callback) { // shortcut any processing if we've got an empty list if (list === undefined || list === null || list.length === 0) { final_callback(undefined, []); return; } var ilist = new Array; var lsize = list.length; var mid_callback = function(err, val){ if (err) final_callback(err, undefined); ilist.push(val); if (ilist.length == lsize) { final_callback(undefined, ilist); } }; for(var i in list) { each_callback(list[i], i, mid_callback); } } // work out unread count for a folder for a user function get_folder_unread(folder, user_read, callback) { var c; redis.scard('folder:'+folder, function(e, c){ if (e) throw(e); redis.sdiff('folder:'+folder, user_read, function(e,v){ if (e) throw(e); callback(undefined, {folder:folder, unread:v.length, count: c}); }) }); } function json_folders(req, res, auth) { redis.smembers('user:test:subs', function(err, subs) { var r = []; if(err) { throw(err); } var q = subs; buffer_to_strings(subs); map(subs, function(f, i, c) { if (f != "test" && f != "mine") { console.log(sys.inspect(q)); console.log("incorrect response from smembers:"+f); process.exit(1); } get_folder_unread(f, 'user:test:read', c); }, function(e, newlist) { res.writeHead(200, {'Content-Type':'application/json'}); res.end(JSON.stringify(newlist)); } ); }); } function folders(app) { app.get('/', function(req, res, next){ json_folders(req, res, 'test'); }); } server.use('/folders', connect.router(folders)); // make sure we have the right data redis.select(2); redis.del('folder:test'); redis.del('folder:mine'); redis.del('user:test:subs'); redis.del('user:test:read'); redis.sadd('folder:test', 1); redis.sadd('folder:test', 2); redis.sadd('folder:test', 4); redis.sadd('folder:mine', 3); redis.sadd('folder:mine', 5); redis.sadd('user:test:subs', 'test'); redis.sadd('user:test:subs', 'mine'); redis.sadd('user:test:read', 2); server.listen(3000); console.log('Connect server listening');