我正在使用 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,成功后再啟動服務器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418428.html
標籤:
