我正在使用 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 评论