forked from soldair/node-memcached-multiplex
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.js
More file actions
91 lines (69 loc) · 2.15 KB
/
index.js
File metadata and controls
91 lines (69 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
module.exports = function(server){
var o = {};
o.stats = {
get:{keys:0,calls:0},
multi:{keys:0,requested:0,calls:0,made:0}
}
// multiplex the cache get.
o._getq = {};
o.get = function(key,cb){
o.stats.get.calls++;
if(o._getq[key]) return o._getq[key].push(cb);
o._getq[key] = [cb];
o.stats.get.keys++;
server.get(key,function(err,data){
var q = o._getq[key];
delete o._getq[key];
while(q.length) q.shift()(err,data);
});
}
// so i want to getMulti but i may be getting multi some of the keys in my list already
// handle
o._multiplexq = {};
o._multicalls = {};
o._multires = {};
o._multiid = 0;
o.getMulti = function(keys,cb){
var tofetch = [];
var id = ++o._multiid;
o.stats.multi.calls++;
o.stats.multi.requested += keys.length;
o._multires[id] = {cb:cb,res:{},c:0};// how many more keys im waiting for and my result
o._multicalls[id] = [];// the keys other people are waiting for.
for(var i=0;i<keys.length;++i) {
if(o._multiplexq[keys[i]]) {
var mid = o._multiplexq[keys[i]];
// i need this key from this getMulti call.
o._multicalls[mid].push([keys[i],id]);
} else {
// im going to get this key.
o._multiplexq[keys[i]] = id;
tofetch.push(keys[i]);
o._multicalls[id].push([keys[i],id]);
}
o._multires[id].c++;
}
if(!tofetch.length) return;
o.stats.multi.keys += keys.length;
o.stats.made++;
server.getMulti(tofetch,function(err,data){
// unroll the keys people are waiting for.
var q = o._multicalls[id];
delete o._multicalls[id];
// i am done fetching. cleanup flags set that defined this id as fetching tofetch keys
for(var i=0;i<tofetch.length;++i) {
delete o._multiplexq[tofetch[i]];
}
// send all callbacks.
while(q.length){
var waiting = q.shift();
var state = o._multires[waiting[1]];
if(err) state.err = err;
else state.res[waiting[0]] = data[waiting[0]];
state.c--;
if(!state.c) state.cb(state.err,state.res);
}
})
}
return o;
}