繁体   English   中英

如何使用 redis 作为 nodejs 应用程序中的模块?

[英]How to use redis as a module within a nodejs aplication?

我正在使用 redis 在我的应用程序上实现缓存机制。 我正在使用redis ^4.0.2

我的应用程序是这样组织的:

 - index.js
 -- routes
    -- users.js
 -- controllers
    -- users.js
 -- models
    -- user.js
 -- db
    -- postgres.js
    -- redis.js

我想在模型中实现缓存,但我想在db/redis.js中创建 redis 连接并将其导出并让 model 需要它。

这就是db/redis.js样子:

const Redis = require('redis');
const redisClient = Redis.createClient();

redisClient.connect();

redisClient.on('connect', function() {
  console.log('Redis is Connected!');
});

redisClient.on('error', err => {
  console.log('Redis Error ' + err);
});

redisClient.on('end', () => {
  console.log('Redis disconnected');
});
redisClient.on('reconnecting', () => {
  console.log('Redis reconnecting');
});

module.exports = redisClient;

这是我的 model:

const postgresClient = require('../db/postgres');
const redisClient = require('../db/redis');

const getAllUsers = (params, callback) => {
   console.log('getAllUsers');
   const page = params.page || 1;
   const count = params.count || 5;
   const offset = (page - 1) * count;
   const queryStr = `SELECT * FROM users OFFSET ${offset} FETCH NEXT ${count} ROWS ONLY`;
   const cacheKey = `\users?page=${page}&count=${count}`;

   redisClient.get(cacheKey, (error, users) => {
      console.log('redisClient.get');
      if (error) callback(error);
      if (users != null) {
         console.log('sending data from cache')  
         callback(null, JSON.parse(users));
      } else {
         postgresClient.query(queryStr, (err, res) => { 
            console.log('querying db and setting cache')
            if (err) callback(err);
            redisClient.setex(cacheKey, DEFAULT_EXPIRATION, JSON.stringify(res.rows))
            callback(null, res.rows);
         })
      }
   }
}

当我运行服务器并向使用此 model 的端点发出请求时, console.log('getAllUsers'); 运行但console.log('redisClient.get'); 没有。

似乎 redis 客户端get callback从未执行,我想知道为什么。

欢迎任何帮助或建议。 提前致谢。

在我看来,你好像在重塑世界。 如果您想要的只是一个缓存,您是否考虑过为此使用 package? 我运气不错:

https://www.npmjs.com/package/cacheman-redis

如果这对您不起作用,看起来 redis npm 的最新版本建议使用承诺,如下所示:

const value = await redisClient.get(`key`);
if (!value) {
  // query postgres and set the value.  
}

如果您不能使用 await,那么我建议您使用 then。 因此,您可以使用redisClient.get(key, callback)而不是使用

redisClient.get(key).then(successCallback).catch(failureCallback)

话虽如此,我强烈建议您查看cacheman-redis并熟悉 async/await 函数和 Promise。 每个都将大大简化您的代码。

redisClient.connect(); 在连接成功之前并没有真正等待。 如果您在成功连接之前运行命令,它将无法正常工作。 您需要在连接之前等待,然后可以安全地运行 Redis 命令。

您可以删除redisClient.connect(); 从您的redis.js文件中,并在您连接它的 index.js 中使用它。

const redisClient = require('../db/redis');
(async () => {
  await redisClient.connect();
  // Redis is connected and do your stuff below

})();

示例源

另外,我建议您先连接 Redis,成功后启动服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM