Using Redis to store analytics on Heroku.
This commit is contained in:
parent
d9a80bb6ed
commit
5685238956
13
Makefile
13
Makefile
|
@ -17,4 +17,15 @@ deploy:
|
||||||
git push origin gh-pages:gh-pages) || git checkout master
|
git push origin gh-pages:gh-pages) || git checkout master
|
||||||
git checkout master
|
git checkout master
|
||||||
|
|
||||||
.PHONY: all favicon website deploy
|
setup:
|
||||||
|
curl http://download.redis.io/releases/redis-2.8.8.tar.gz >redis.tar.gz \
|
||||||
|
&& tar xf redis.tar.gz \
|
||||||
|
&& rm redis.tar.gz \
|
||||||
|
&& mv redis-2.8.8 redis \
|
||||||
|
&& cd redis \
|
||||||
|
&& make
|
||||||
|
|
||||||
|
redis:
|
||||||
|
./redis/src/redis-server
|
||||||
|
|
||||||
|
.PHONY: all favicon website deploy setup redis
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
"phantomjs": "~1.9.2-6",
|
"phantomjs": "~1.9.2-6",
|
||||||
"es6-promise": "~0.1.1",
|
"es6-promise": "~0.1.1",
|
||||||
"request": "~2.34.0",
|
"request": "~2.34.0",
|
||||||
|
"redis": "~0.10.1",
|
||||||
"camp": "~13.11.9"
|
"camp": "~13.11.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
55
server.js
55
server.js
|
@ -11,24 +11,61 @@ var serverStartTime = new Date((new Date()).toGMTString());
|
||||||
|
|
||||||
// Analytics
|
// Analytics
|
||||||
|
|
||||||
|
var redis;
|
||||||
|
// Use Redis by default.
|
||||||
|
var useRedis = true;
|
||||||
|
if (process.env.REDISTOGO_URL) {
|
||||||
|
var redisToGo = require('url').parse(process.env.REDISTOGO_URL);
|
||||||
|
redis = require('redis').createClient(redisToGo.port, redisToGo.hostname);
|
||||||
|
redis.auth(redisToGo.auth.split(':')[1]);
|
||||||
|
} else {
|
||||||
|
redis = require('redis').createClient();
|
||||||
|
}
|
||||||
|
redis.on('error', function() {
|
||||||
|
useRedis = false;
|
||||||
|
});
|
||||||
|
|
||||||
var analytics = {};
|
var analytics = {};
|
||||||
|
|
||||||
var analyticsAutoSaveFileName = './analytics.json';
|
var analyticsAutoSaveFileName = './analytics.json';
|
||||||
var analyticsAutoSavePeriod = 10000;
|
var analyticsAutoSavePeriod = 10000;
|
||||||
setInterval(function analyticsAutoSave() {
|
setInterval(function analyticsAutoSave() {
|
||||||
fs.writeFile(analyticsAutoSaveFileName, JSON.stringify(analytics));
|
if (useRedis) {
|
||||||
|
redis.set(analyticsAutoSaveFileName, JSON.stringify(analytics));
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync(analyticsAutoSaveFileName, JSON.stringify(analytics));
|
||||||
|
}
|
||||||
}, analyticsAutoSavePeriod);
|
}, analyticsAutoSavePeriod);
|
||||||
|
|
||||||
// Auto-load analytics.
|
// Auto-load analytics.
|
||||||
function analyticsAutoLoad() {
|
function analyticsAutoLoad() {
|
||||||
try {
|
if (useRedis) {
|
||||||
analytics = JSON.parse(fs.readFileSync(analyticsAutoSaveFileName));
|
redis.get(analyticsAutoSaveFileName, function(err, value) {
|
||||||
} catch(e) {
|
if (err == null && value != null) {
|
||||||
// In case something happens on the 36th.
|
// if/try/return trick:
|
||||||
analytics.vendorMonthly = new Array(36);
|
// if error, then the rest of the function is run.
|
||||||
analytics.rawMonthly = new Array(36);
|
try {
|
||||||
resetMonthlyAnalytics(analytics.vendorMonthly);
|
analytics = JSON.parse(value);
|
||||||
resetMonthlyAnalytics(analytics.rawMonthly);
|
return;
|
||||||
|
} catch(e) {}
|
||||||
|
}
|
||||||
|
// In case something happens on the 36th.
|
||||||
|
analytics.vendorMonthly = new Array(36);
|
||||||
|
analytics.rawMonthly = new Array(36);
|
||||||
|
resetMonthlyAnalytics(analytics.vendorMonthly);
|
||||||
|
resetMonthlyAnalytics(analytics.rawMonthly);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Not using Redis.
|
||||||
|
try {
|
||||||
|
analytics = JSON.parse(fs.readFileSync(analyticsAutoSaveFileName));
|
||||||
|
} catch(e) {
|
||||||
|
// In case something happens on the 36th.
|
||||||
|
analytics.vendorMonthly = new Array(36);
|
||||||
|
analytics.rawMonthly = new Array(36);
|
||||||
|
resetMonthlyAnalytics(analytics.vendorMonthly);
|
||||||
|
resetMonthlyAnalytics(analytics.rawMonthly);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user