NodeJs用Redis缓存

时间:2015-10-28 17:29:53

标签: node.js caching redis

我是NodeJs和Redis的新手,想要实现Redis提出的缓存功能。

我正在尝试使用以下查询,但我不确定在经过大量谷歌搜索后如何继续前进。查询如下:

module.exports = function(app) {

app.get('/api/data', function(req, res) {
 Subjects.find({}, {'_id': 0, 'school_state': 1, 'resource_type': 1, 'poverty_level': 1, 'date_posted': 1, 'total_donations': 1, 'funding_status': 1, 'grade_level': 1}, 
  function(err, subjectDetails) {
   if (err) 
   res.send(err);
    res.json(subjectDetails); 
  });
 });
 }

你能告诉你如何前进吗?

1 个答案:

答案 0 :(得分:0)

以下是上述要点发布的解决方案。 API请求将回调传递给getSubjects。 getSubjects在对数据进行数据库调用之前检查redis缓存。

var redis = require('redis')


var cache = redis.createClient()

var subjectQueryParams = {'_id': 0, 'school_state': 1, 'resource_type': 1, 'poverty_level': 1, 'date_posted': 1, 'total_donations': 1, 'funding_status': 1, 'grade_level': 1}

var getSubjects = function(done) {
     cache.get('subjects', function(err, data){
        if(err) return done(err)
     if(data)
       return done(null, JSON.parse(data))
     Subjects.find({}, subjectQueryParams, function(err, results) {
       if(err) return done(err)
       if(results) {
         cache.set('subjects', JSON.stringify(results))
       }
       done(null, results) // no results
    })
  })
}

app.get('/api/data', function(req, res) {
 getSubjects(function(err, data) {
   if (err) return res.send(err);
   res.json(data); 
});

使用异步/等待(假设cache.get和Subjects.find返回承诺)

const redis = require('redis')
const cache = redis.createClient()

const subjectQueryParams = {'_id': 0, 'school_state': 1, 'resource_type': 1, 'poverty_level': 1, 'date_posted': 1, 'total_donations': 1, 'funding_status': 1, 'grade_level': 1}

async function getSubjects() {
     const data = await cache.get('subjects') 
     if(data)
       return JSON.parse(data)
     const results = await Subjects.find({}, subjectQueryParams)
     if(results) {
        cache.set('subjects', JSON.stringify(results))
     }
     return results
  })
}

app.get('/api/data', async function(req, res) {
   const data = await getSubjects()
   res.json(data)
})