Skip to content

Commit f3cb1a4

Browse files
committed
抽象 cache 层
1 parent deea1c0 commit f3cb1a4

File tree

3 files changed

+130
-90
lines changed

3 files changed

+130
-90
lines changed

common/cache.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
var mcache = require('memory-cache');
3+
4+
var get = function (key, callback) {
5+
setImmediate(function () {
6+
callback(null, mcache.get(key));
7+
});
8+
};
9+
10+
exports.get = get;
11+
12+
// time 参数可选,毫秒为单位
13+
var set = function (key, value, time, callback) {
14+
if (typeof time === 'function') {
15+
callback = time;
16+
time = null;
17+
}
18+
mcache.put(key, value, time);
19+
setImmediate(function () {
20+
callback && callback(null);
21+
});
22+
};
23+
24+
exports.set = set;

controllers/rss.js

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
11
var config = require('../config');
22
var convert = require('data2xml')();
33
var Topic = require('../proxy').Topic;
4-
var mcache = require('memory-cache');
4+
var cache = require('../common/cache');
55
var marked = require('marked');
6+
var eventproxy = require('eventproxy');
67

78
exports.index = function (req, res, next) {
89
if (!config.rss) {
910
res.statusCode = 404;
1011
return res.send('Please set `rss` in config.js');
1112
}
1213
res.contentType('application/xml');
13-
if (!config.debug && mcache.get('rss')) {
14-
res.send(mcache.get('rss'));
15-
} else {
16-
var opt = { limit: config.rss.max_rss_items, sort: '-create_at'};
17-
Topic.getTopicsByQuery({}, opt, function (err, topics) {
18-
if (err) {
19-
return next(err);
20-
}
21-
var rss_obj = {
22-
_attr: { version: '2.0' },
23-
channel: {
24-
title: config.rss.title,
25-
link: config.rss.link,
26-
language: config.rss.language,
27-
description: config.rss.description,
28-
item: []
14+
15+
var ep = new eventproxy();
16+
ep.fail(next);
17+
18+
cache.get('rss', ep.done(function (rss) {
19+
if (!config.debug && rss) {
20+
res.send(rss);
21+
} else {
22+
var opt = { limit: config.rss.max_rss_items, sort: '-create_at'};
23+
Topic.getTopicsByQuery({}, opt, function (err, topics) {
24+
if (err) {
25+
return next(err);
2926
}
30-
};
27+
var rss_obj = {
28+
_attr: { version: '2.0' },
29+
channel: {
30+
title: config.rss.title,
31+
link: config.rss.link,
32+
language: config.rss.language,
33+
description: config.rss.description,
34+
item: []
35+
}
36+
};
3137

32-
topics.forEach(function (topic) {
33-
rss_obj.channel.item.push({
34-
title: topic.title,
35-
link: config.rss.link + '/topic/' + topic._id,
36-
guid: config.rss.link + '/topic/' + topic._id,
37-
description: marked(topic.content),
38-
author: topic.author.loginname,
39-
pubDate: topic.create_at.toUTCString()
38+
topics.forEach(function (topic) {
39+
rss_obj.channel.item.push({
40+
title: topic.title,
41+
link: config.rss.link + '/topic/' + topic._id,
42+
guid: config.rss.link + '/topic/' + topic._id,
43+
description: marked(topic.content),
44+
author: topic.author.loginname,
45+
pubDate: topic.create_at.toUTCString()
46+
});
4047
});
41-
});
4248

43-
var rssContent = convert('rss', rss_obj);
49+
var rssContent = convert('rss', rss_obj);
4450

45-
mcache.put('rss', rssContent, 1000 * 60 * 5); // 五分钟
46-
res.send(rssContent);
47-
});
48-
}
51+
cache.set('rss', rssContent, 1000 * 60 * 5); // 五分钟
52+
res.send(rssContent);
53+
});
54+
}
55+
}));
4956
};

controllers/site.js

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var User = require('../proxy').User;
1313
var Topic = require('../proxy').Topic;
1414
var config = require('../config');
1515
var eventproxy = require('eventproxy');
16-
var mcache = require('memory-cache');
16+
var cache = require('../common/cache');
1717
var xmlbuilder = require('xmlbuilder');
1818
var renderHelpers = require('../common/render_helpers');
1919

@@ -32,8 +32,7 @@ function indexCache() {
3232
}
3333
var optionsStr = JSON.stringify(query) + JSON.stringify(options);
3434
Topic.getTopicsByQuery(query, options, function (err, topics) {
35-
mcache.put(optionsStr, topics);
36-
return topics;
35+
cache.set(optionsStr, topics);
3736
});
3837
});
3938
}
@@ -61,53 +60,62 @@ exports.index = function (req, res, next) {
6160
var options = { skip: (page - 1) * limit, limit: limit, sort: '-top -last_reply_at'};
6261
var optionsStr = JSON.stringify(query) + JSON.stringify(options);
6362

64-
if (mcache.get(optionsStr)) {
65-
proxy.emitLater('topics', mcache.get(optionsStr));
66-
} else {
63+
cache.get(optionsStr, proxy.done(function (topics) {
64+
if (topics) {
65+
return proxy.emit('topics', topics);
66+
}
6767
Topic.getTopicsByQuery(query, options, proxy.done('topics', function (topics) {
6868
return topics;
6969
}));
70-
}
70+
}));
7171
// END 取主题
7272

7373
// 取排行榜上的用户
74-
if (mcache.get('tops')) {
75-
proxy.emitLater('tops', mcache.get('tops'));
76-
} else {
77-
User.getUsersByQuery(
78-
{'$or': [
79-
{is_block: {'$exists': false}},
80-
{is_block: false}
81-
]},
82-
{ limit: 10, sort: '-score'},
83-
proxy.done('tops', function (tops) {
84-
mcache.put('tops', tops, 1000 * 60 * 1);
85-
return tops;
86-
})
87-
);
88-
}
74+
cache.get('tops', proxy.done(function (tops) {
75+
if (tops) {
76+
proxy.emit('tops', tops);
77+
} else {
78+
User.getUsersByQuery(
79+
{'$or': [
80+
{is_block: {'$exists': false}},
81+
{is_block: false}
82+
]},
83+
{ limit: 10, sort: '-score'},
84+
proxy.done('tops', function (tops) {
85+
cache.set('tops', tops, 1000 * 60 * 1);
86+
return tops;
87+
})
88+
);
89+
}
90+
}));
91+
8992
// 取0回复的主题
90-
if (mcache.get('no_reply_topics')) {
91-
proxy.emitLater('no_reply_topics', mcache.get('no_reply_topics'));
92-
} else {
93-
Topic.getTopicsByQuery(
94-
{ reply_count: 0 },
95-
{ limit: 5, sort: '-create_at'},
96-
proxy.done('no_reply_topics', function (no_reply_topics) {
97-
mcache.put('no_reply_topics', no_reply_topics, 1000 * 60 * 1);
98-
return no_reply_topics;
99-
}));
100-
}
93+
cache.get('no_reply_topics', proxy.done(function (no_reply_topics) {
94+
if (no_reply_topics) {
95+
proxy.emit('no_reply_topics', no_reply_topics);
96+
} else {
97+
Topic.getTopicsByQuery(
98+
{ reply_count: 0 },
99+
{ limit: 5, sort: '-create_at'},
100+
proxy.done('no_reply_topics', function (no_reply_topics) {
101+
cache.set('no_reply_topics', no_reply_topics, 1000 * 60 * 1);
102+
return no_reply_topics;
103+
}));
104+
}
105+
}));
106+
101107
// 取分页数据
102-
if (mcache.get('pages')) {
103-
proxy.emitLater('pages', mcache.get('pages'));
104-
} else {
105-
Topic.getCountByQuery(query, proxy.done(function (all_topics_count) {
106-
var pages = Math.ceil(all_topics_count / limit);
107-
mcache.put(JSON.stringify(query) + 'pages', pages, 1000 * 60 * 1);
108+
cache.get('pages', proxy.done(function (pages) {
109+
if (pages) {
108110
proxy.emit('pages', pages);
109-
}));
110-
}
111+
} else {
112+
Topic.getCountByQuery(query, proxy.done(function (all_topics_count) {
113+
var pages = Math.ceil(all_topics_count / limit);
114+
cache.set(JSON.stringify(query) + 'pages', pages, 1000 * 60 * 1);
115+
proxy.emit('pages', pages);
116+
}));
117+
}
118+
}));
111119

112120
var tabName = renderHelpers.tabName(tab);
113121
proxy.all('topics', 'tops', 'no_reply_topics', 'pages',
@@ -139,22 +147,23 @@ exports.sitemap = function (req, res, next) {
139147
res.send(sitemap);
140148
});
141149

142-
var sitemapData = mcache.get('sitemap');
143-
if (sitemapData) {
144-
ep.emit('sitemap', sitemapData);
145-
} else {
146-
Topic.getLimit5w(function (err, topics) {
147-
if (err) {
148-
return next(err);
149-
}
150-
topics.forEach(function (topic) {
151-
urlset.ele('url').ele('loc', 'http://cnodejs.org/topic/' + topic._id);
152-
});
153-
154-
var sitemapData = urlset.end();
155-
// 缓存一天
156-
mcache.put('sitemap', sitemapData, 1000 * 3600 * 24);
150+
cache.get('sitemap', ep.done(function (sitemapData) {
151+
if (sitemapData) {
157152
ep.emit('sitemap', sitemapData);
158-
});
159-
}
153+
} else {
154+
Topic.getLimit5w(function (err, topics) {
155+
if (err) {
156+
return next(err);
157+
}
158+
topics.forEach(function (topic) {
159+
urlset.ele('url').ele('loc', 'http://cnodejs.org/topic/' + topic._id);
160+
});
161+
162+
var sitemapData = urlset.end();
163+
// 缓存一天
164+
cache.set('sitemap', sitemapData, 1000 * 3600 * 24);
165+
ep.emit('sitemap', sitemapData);
166+
});
167+
}
168+
}));
160169
};

0 commit comments

Comments
 (0)