feat: #8824, cache refactor (#8851)

* feat: #8824, cache refactor

ability to disable caches
ability to download contents of cache
refactor cache modules to remove duplicated code

* fix: remove duplicate hit/miss tracking

check cacheEnabled in getUncachedKeys
This commit is contained in:
Barış Soner Uşaklı
2020-11-06 23:13:12 -05:00
committed by GitHub
parent bcbc085497
commit f1f9b225b0
23 changed files with 226 additions and 199 deletions

View File

@@ -1,56 +1,11 @@
'use strict';
module.exports.create = function (name) {
var LRU = require('lru-cache');
var pubsub = require('../pubsub');
var cache = new LRU({
const cacheCreate = require('../cacheCreate');
return cacheCreate({
name: name + '-object',
max: 40000,
length: function () { return 1; },
maxAge: 0,
});
cache.misses = 0;
cache.hits = 0;
pubsub.on(name + ':hash:cache:del', function (keys) {
keys.forEach(key => cache.del(key));
});
pubsub.on(name + ':hash:cache:reset', function () {
cache.reset();
});
cache.delObjectCache = function (keys) {
if (!Array.isArray(keys)) {
keys = [keys];
}
pubsub.publish(name + ':hash:cache:del', keys);
keys.forEach(key => cache.del(key));
};
cache.resetObjectCache = function () {
pubsub.publish(name + ':hash:cache:reset');
cache.reset();
};
cache.getUnCachedKeys = function (keys, cachedData) {
let data;
let isCached;
const unCachedKeys = keys.filter(function (key) {
data = cache.get(key);
isCached = data !== undefined;
if (isCached) {
cachedData[key] = data;
}
return !isCached;
});
var hits = keys.length - unCachedKeys.length;
var misses = keys.length - hits;
cache.hits += hits;
cache.misses += misses;
return unCachedKeys;
};
return cache;
};

View File

@@ -29,7 +29,7 @@ module.exports = function (module) {
throw err;
}
cache.delObjectCache(key);
cache.del(key);
};
module.setObjectField = async function (key, field, value) {
@@ -164,7 +164,7 @@ module.exports = function (module) {
});
await module.client.collection('objects').updateOne({ _key: key }, { $unset: data });
cache.delObjectCache(key);
cache.del(key);
};
module.incrObjectField = async function (key, field) {
@@ -191,13 +191,13 @@ module.exports = function (module) {
bulk.find({ _key: key }).upsert().update({ $inc: increment });
});
await bulk.execute();
cache.delObjectCache(key);
cache.del(key);
const result = await module.getObjectsFields(key, [field]);
return result.map(data => data && data[field]);
}
const result = await module.client.collection('objects').findOneAndUpdate({ _key: key }, { $inc: increment }, { returnOriginal: false, upsert: true });
cache.delObjectCache(key);
cache.del(key);
return result && result.value ? result.value[field] : null;
};
};

View File

@@ -8,7 +8,7 @@ module.exports = function (module) {
module.emptydb = async function () {
await module.client.collection('objects').deleteMany({});
module.objectCache.resetObjectCache();
module.objectCache.reset();
};
module.exists = async function (key) {
@@ -47,7 +47,7 @@ module.exports = function (module) {
return;
}
await module.client.collection('objects').deleteMany({ _key: key });
module.objectCache.delObjectCache(key);
module.objectCache.del(key);
};
module.deleteAll = async function (keys) {
@@ -55,7 +55,7 @@ module.exports = function (module) {
return;
}
await module.client.collection('objects').deleteMany({ _key: { $in: keys } });
module.objectCache.delObjectCache(keys);
module.objectCache.del(keys);
};
module.get = async function (key) {
@@ -96,7 +96,7 @@ module.exports = function (module) {
module.rename = async function (oldKey, newKey) {
await module.client.collection('objects').updateMany({ _key: oldKey }, { $set: { _key: newKey } });
module.objectCache.delObjectCache([oldKey, newKey]);
module.objectCache.del([oldKey, newKey]);
};
module.type = async function (key) {

View File

@@ -33,7 +33,7 @@ module.exports = function (module) {
await module.client.async.hmset(key, data);
}
cache.delObjectCache(key);
cache.del(key);
};
module.setObjectField = async function (key, field, value) {
@@ -48,7 +48,7 @@ module.exports = function (module) {
await module.client.async.hset(key, field, value);
}
cache.delObjectCache(key);
cache.del(key);
};
module.getObject = async function (key) {
@@ -146,7 +146,7 @@ module.exports = function (module) {
return;
}
await module.client.async.hdel(key, field);
cache.delObjectCache(key);
cache.del(key);
};
module.deleteObjectFields = async function (key, fields) {
@@ -158,7 +158,7 @@ module.exports = function (module) {
return;
}
await module.client.async.hdel(key, fields);
cache.delObjectCache(key);
cache.del(key);
};
module.incrObjectField = async function (key, field) {
@@ -182,7 +182,7 @@ module.exports = function (module) {
} else {
result = await module.client.async.hincrby(key, field, value);
}
cache.delObjectCache(key);
cache.del(key);
return Array.isArray(result) ? result.map(value => parseInt(value, 10)) : parseInt(result, 10);
};
};

View File

@@ -9,7 +9,7 @@ module.exports = function (module) {
module.emptydb = async function () {
await module.flushdb();
module.objectCache.resetObjectCache();
module.objectCache.reset();
};
module.exists = async function (key) {
@@ -45,7 +45,7 @@ module.exports = function (module) {
module.delete = async function (key) {
await module.client.async.del(key);
module.objectCache.delObjectCache(key);
module.objectCache.del(key);
};
module.deleteAll = async function (keys) {
@@ -53,7 +53,7 @@ module.exports = function (module) {
return;
}
await module.client.async.del(keys);
module.objectCache.delObjectCache(keys);
module.objectCache.del(keys);
};
module.get = async function (key) {
@@ -77,7 +77,7 @@ module.exports = function (module) {
}
}
module.objectCache.delObjectCache([oldKey, newKey]);
module.objectCache.del([oldKey, newKey]);
};
module.type = async function (key) {