使用node-cache-manager定制缓存

时间:2016-09-21 13:11:16

标签: mysql node.js express caching sequelize.js

我正在尝试在我的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));
});

我已经尝试过遵循文档和示例,但是如上所述,这仍然每次都会访问数据库!任何帮助都很受欢迎!!!

1 个答案:

答案 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函数是如何工作的以及它为我现在明确设置和获取缓存值的原因,还是会赞赏一些评论:)。