Skip to content

Commit

Permalink
Cache: Implementing redis cache on common services
Browse files Browse the repository at this point in the history
  • Loading branch information
ccoloradoc committed Feb 16, 2018
1 parent c43d1d0 commit e58e8c5
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 15 deletions.
37 changes: 37 additions & 0 deletions app/config/cache.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
var redis = require('redis');

// create a new redis client and connect to our local redis instance
var client = redis.createClient({
host: 'redis'
});

// if an error occurs, print it to the console
client.on('error', function (err) {
console.log("Error " + err);
});

client.flushdb( function (err, succeeded) {
console.log(succeeded); // will be true if successfull
});

function cacheFilter(key) {
return function(key, req, res, next) {
client.get(key, function(error, result) {
if (result) {
console.log('>> source - cache');
res.json(JSON.parse(result));
} else {
next();
}
});
}.bind(null, key);
}

function cache(key, value) {
// Cache last 10 hours
client.set(key, JSON.stringify(value), 'EX', 36000);
}

module.exports = {
cacheFilter, cache
};
37 changes: 22 additions & 15 deletions app/routes/attendance.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
var express = require('express');
var router = express.Router();
var models = require('../models');
var cache = require('../config/cache');

/* Path: /legislature/LXIII/attendance => attendance.js
/api/legislature/LXIII/attendance/avg
Expand All @@ -10,21 +11,22 @@ var models = require('../models');
*/

/* /api/legislature/LXIII/attendance */
router.get('/', function(req, res, next) {
let queryString =
'select * from attendance_list order by entries desc';
router.get('/', cache.cacheFilter('LXIII-attendance'), function(req, res, next) {
let queryString =
'select * from attendance_list order by entries desc';

models.sequelize
.query(queryString, {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
res.json(result);
models.sequelize
.query(queryString, {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance', result);
res.json(result);
});
});
});

/* /api/legislature/LXIII/attendance/avg */
router.get('/avg', function(req, res, next) {
router.get('/avg', cache.cacheFilter('LXIII-attendance-avg'), function(req, res, next) {
let queryString =
'select avg(quantity) as average, max(quantity) as max, min(quantity) as min from seat_attendance';

Expand All @@ -33,12 +35,13 @@ router.get('/avg', function(req, res, next) {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance-avg', result[0]);
res.json(result[0]);
});
});

/* /api/legislature/LXIII/attendance/frequency */
router.get('/frequency', function(req, res, next) {
router.get('/frequency', cache.cacheFilter('LXIII-attendance-frequency'), function(req, res, next) {
let queryString =
'select st2.quantity, st2.frequency, @running_total := @running_total + st2.frequency AS cumulative_frequency from attendance_frequency st2 join (select @running_total := 0) r'

Expand All @@ -47,12 +50,13 @@ router.get('/frequency', function(req, res, next) {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance-frequency', result);
res.json(result);
});
});

/* /api/legislature/LXIII/attendance/by_party */
router.get('/by_party', function(req, res, next) {
router.get('/by_party', cache.cacheFilter('LXIII-attendance-by-party'), function(req, res, next) {
let queryString =
'select party, round(avg(quantity), 2) as average, max(quantity) as max, min(quantity) as min, round(avg(quantity) + stddev(quantity)/2, 2) as max_std, round(avg(quantity) - stddev(quantity)/2,2) as min_std, count(1) as deputies from seat_attendance group by party order by average';

Expand All @@ -61,12 +65,13 @@ router.get('/by_party', function(req, res, next) {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance-by-party', result);
res.json(result);
});
});

/* /api/legislature/LXIII/attendance/by_state */
router.get('/by_state', function(req, res, next) {
router.get('/by_state', cache.cacheFilter('LXIII-attendance-by-state'), function(req, res, next) {
let queryString =
'select state, round(avg(entries), 2) as average, max(entries) as max, min(entries) as min, round(avg(entries) + stddev(entries)/2, 2) as max_std, round(avg(entries) - stddev(entries)/2,2) as min_std, count(1) as deputies from attendance_list group by state order by average';

Expand All @@ -75,12 +80,13 @@ router.get('/by_state', function(req, res, next) {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance-by-state', result);
res.json(result);
});
});

/* /api/legislature/LXIII/attendance/by_deputy_type */
router.get('/by_deputy_type', function(req, res, next) {
router.get('/by_deputy_type', cache.cacheFilter('LXIII-attendance-by-deputy-type'), function(req, res, next) {
let queryString =
'select type, party, avg(quantity) as average, count(1) as deputies from seat_attendance group by type, party order by party, type';

Expand All @@ -89,6 +95,7 @@ router.get('/by_deputy_type', function(req, res, next) {
type: models.sequelize.QueryTypes.SELECT
})
.then(function(result) {
cache.cache('LXIII-attendance-by-deputy-type', result);
res.json(result);
});
});
Expand Down

0 comments on commit e58e8c5

Please sign in to comment.