我正在尝试在我的webapp中引入最简单的缓存层,我想要做的就是将查询的结果缓存24小时,因为这是DB接收新数据的频率。我正在尝试使用node-cache-manager(看起来很棒)但是很挣扎!我不认为我完全理解它应该如何实现为sequelize。这个例子是使用Mongoose和Mongo的外观:
function responder(res) {
return function respond(err, data) {
var startTime = moment(res.req._startTime);
var diff = moment().diff(startTime, 'ms');
if (err) {
err.status = 500;
res.render('error', {error: err});
} else {
data.requestTime = diff;
res.render('users/show', data);
}
};
}
function fetchUser(id, cb) {
var cacheKey = 'user_' + id;
memoryCache.wrap(cacheKey, function (cacheCb) {
console.log("Fetching user from slow database");
User.get(id, cacheCb);
}, cb);
}
router.get('/:id', function (req, res) {
fetchUser(req.param('id'), responder(res));
});
我正在使用MySQL并且目前有以下示例,但我每次都能看到查询到达数据库,它似乎没有持久化或创建缓存......:
function responder(res) {
return function respond(err, data) {
var startTime = moment(res.req._startTime);
var diff = moment().diff(startTime, 'ms');
if (err) {
err.status = 500;
res.json({valuesCount: err});
} else {
data.requestTime = diff;
res.json({valuesCount: res});
}
};
}
function fetchCount(req, cb) {
var cacheKey = 'allDatabaseRecords',
table = sequelize.import('extracts');
memoryCache.wrap(cacheKey, function (cacheCb) {
console.log("Fetching count from slow database");
table.count().then(cacheCb);
}, cb);
}
router.post('/extract-tool/data-filter', function(req, res) {
var table = sequelize.import('extracts');
fetchCount(req, responder(res));
});
我已经尝试过遵循文档和示例,但是如上所述,这仍然每次都会访问数据库!任何帮助都很受欢迎!!!
答案 0 :(得分:0)
根据给出的示例,我无法使其工作,我必须每次都专门设置并从缓存中获取键值对。
现在它工作正常,结构如下:
memoryCache.get(cacheKey, function(err, result) {
if (result !== undefined){res.json({billingAddress12LastName: result});}
});
memoryCache.wrap(cacheKey, function (cacheCb) {
console.log("Fetching count from slow database");
table.count().then(data);
memoryCache.set(cacheKey, data, {ttl: ttl}, function(err) {
res.json({valuesCount: data});
});
}, cb);
仍然不明白wrap函数是如何工作的以及它为我现在明确设置和获取缓存值的原因,还是会赞赏一些评论:)。