Skip to content
This repository has been archived by the owner on May 28, 2021. It is now read-only.

Commit

Permalink
created memory cacher as fallback
Browse files Browse the repository at this point in the history
  • Loading branch information
icebob committed Nov 22, 2016
1 parent 26338eb commit f056f03
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 7 deletions.
2 changes: 1 addition & 1 deletion nodemon.json
@@ -1,5 +1,5 @@
{
"ignore": ["client/**/*.*", "server/locales/**/*.*"],
"ignore": ["node_modules", ".git", "client/**/*.*", "server/locales/**/*.*"],

"__exec": "nodejs-dashboard node server/dev.js",

Expand Down
125 changes: 125 additions & 0 deletions server/core/cacher/cacher-memory.js
@@ -0,0 +1,125 @@
"use strict";

let config = require("../../config");
let logger = require("../logger");
let redis = require("../redis");

let _ = require("lodash");
/**
* Cacher factory for memory cache
*
* Similar: https://github.com/mpneuried/nodecache/blob/master/_src/lib/node_cache.coffee
*
* @class Cacher
*/
class Cacher {

/**
* Creates an instance of Cacher.
*
* @param {any} type
* @param {any} prefix
* @param {any} ttl
*
* @memberOf Cacher
*/
constructor(prefix, ttl) {
logger.debug("Memory Cacher created. Prefix: " + prefix);

// Cache container
this.cache = {};

this.prefix = prefix ? prefix + ":" : "";
this.ttl = ttl;

if (ttl) {
this.timer = setInterval(() => {
this.checkTTL();
}, 30 * 1000);
}
}

/**
* Get data from cache by key
*
* @param {any} key
* @returns {Promise}
*
* @memberOf Cacher
*/
get(key) {
return new Promise((resolve, reject) => {
logger.debug("Cacher: Get from cache by key:", key);
let item = this.cache[this.prefix + key];
if (item)
resolve(item.data);
else
resolve(null);
});
}

/**
* Set data to cache by key
*
* @param {any} key
* @param {any} data JSON object
* @returns {Promise}
*
* @memberOf Cacher
*/
set(key, data) {
this.cache[this.prefix + key] = {
data: data,
expire: Date.now() + this.ttl * 1000
};
logger.debug("Cacher: Set to cache by key:", key);
return Promise.resolve();
}

/**
* Delete a key from cache
*
* @param {any} key
* @returns {Promise}
*
* @memberOf Cacher
*/
del(key) {
delete this.cache[this.prefix + key];
logger.debug("Cacher: Delete from cache by key:", key);
return Promise.resolve();
}

/**
* Clean cache. Remove every key by prefix
* http://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis
* alternative solution:
* https://github.com/cayasso/cacheman-redis/blob/master/lib/index.js#L125
* @param {any} match Match string for SCAN. Default is "*"
* @returns {Promise}
*
* @memberOf Cacher
*/
clean(match) {
// TODO: match not supported yet
logger.debug("Cacher: Clear all entries from cache.");
this.cache = {};
return Promise.resolve();
}

checkTTL() {
let self = this;
let now = Date.now();
let keys = Object.keys(this.cache);
keys.forEach((key) => {
let item = this.cache[key];

if (item.expire && item.expire < now) {
logger.debug(`Cacher: Item '${key} is expired!`);
delete self.cache[key];
}
});
}

}
module.exports = Cacher;
9 changes: 5 additions & 4 deletions server/libs/cacher.js → server/core/cacher/cacher-redis.js
@@ -1,12 +1,12 @@
"use strict";

let config = require("../config");
let logger = require("../core/logger");
let redis = require("../core/redis");
let config = require("../../config");
let logger = require("../logger");
let redis = require("../redis");

let _ = require("lodash");
/**
* Cache class. Use prefixes and TTL
* Cacher factory for Redis
*
* @class Cacher
*/
Expand All @@ -22,6 +22,7 @@ class Cacher {
* @memberOf Cacher
*/
constructor(prefix, ttl) {
logger.debug("Redis Cacher created. Prefix: " + prefix);
this.prefix = prefix ? prefix + ":" : "";
this.ttl = ttl;
}
Expand Down
17 changes: 17 additions & 0 deletions server/core/cacher/index.js
@@ -0,0 +1,17 @@
"use strict";

let config = require("../../config");
let logger = require("../logger");
let redis = require("../redis");

let _ = require("lodash");

let MemoryCacher = require("./cacher-memory");
let RedisCacher = require("./cacher-redis");

module.exports = function(type, prefix, ttl) {
switch(type) {
case "redis": return new RedisCacher(prefix, ttl);
default: return new MemoryCacher(prefix, ttl);
}
};
5 changes: 3 additions & 2 deletions server/core/services.js
Expand Up @@ -15,7 +15,7 @@ let C = require("./constants");
let Context = require("./context");
let auth = require("./auth/helper");
let response = require("./response");
let Cacher = require("../libs/cacher");
let Cacher = require("./cacher");

let listEndpoints = require("express-list-endpoints");
let Table = require("cli-table2");
Expand Down Expand Up @@ -58,7 +58,8 @@ class Services extends EventEmitter {
let addService = function(service) {
service.app = app;
service.db = db;
service.cacher = new Cacher(service.name, config.cacheTimeout);
// config.redis.enabled ? "redis" : "memory"
service.cacher = new Cacher("memory", service.name, config.cacheTimeout);
service.cacher.clean();
self.services[service.name] = service;
};
Expand Down

0 comments on commit f056f03

Please sign in to comment.