拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在nodejs应用程序中使用redis作为模块?

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

白鹭 - 2022-01-23 2148 0 0

我正在使用 redis 在我的应用程序上实作快取机制。我正在使用redis ^4.0.2.

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

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

我想在模型中实作快取,但我想在其中创建 redis 连接db/redis.js并汇出它并让模型需要它。

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;

这是我的模型:

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);
         })
      }
   }
}

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

似乎 redis 客户端get callback永远不会执行,我想知道为什么。

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

uj5u.com热心网友回复:

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

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

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

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。每个都将大大简化您的代码。

uj5u.com热心网友回复:

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,成功后再启动服务器。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *