[英]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.