今天,我将Redis集成到我的node.js应用程序中,并将其用作会话存储。基本上,在成功验证后,我将相应的用户对象存储在Redis中。
当我在身份验证后收到http请求时,我尝试使用哈希从Redis中检索用户对象。如果检索成功,则表示用户已登录并且可以完成请求。
将用户对象存储在Redis中的行为和检索发生在两个不同的文件中,因此我在每个文件中都有一个Redis客户端。
问题1: 是否有两个Redis客户端,每个文件一个?或者我应该只实例化一个客户端并在应用程序的所有区域使用它?
问题2: node-redis库是否提供显示已连接客户端列表的方法?如果是这样,我将能够遍历列表,并在服务器关闭时为每个列表调用client.quit()。
顺便说一句,这就是我实现服务器“正常关闭”的方式:
//Gracefully shutdown and perform clean-up when kill signal is received
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);
function cleanup() {
server.stop(function() {
//todo: quit all connected redis clients
console.log('Server stopped.');
//exit the process
process.exit();
});
};
答案 0 :(得分:2)
可能要求使用多个连接,具体取决于应用程序如何使用Redis。
例如,一旦使用连接来收听发布/订阅频道,则只能用于此目的,而不能用于其他目的。根据{{3}}上的文档:
一旦客户端进入订阅状态,就不应该发出任何其他命令,除了其他
SUBSCRIBE
,PSUBSCRIBE
,UNSUBSCRIBE
和PUNSUBSCRIBE
命令之外。
因此,如果您的应用程序需要订阅频道,并且将Redis用作常规值缓存,则它至少需要两个客户端:一个用于订阅频道,一个用于将Redis用作缓存。
也有像SUBSCRIBE
这样阻塞的Redis命令。繁忙的Web服务器通常一次答复多个请求。假设服务器为响应请求A,使用其Redis客户端发出阻止命令。然后请求B到来,服务器需要使用非阻塞命令来回答Redis,但是客户端仍在等待发出的阻塞命令以使请求A完成。现在,对请求B的响应被另一个请求延迟。可以通过将另一个客户端用于第二个请求来避免这种情况。
如果您不使用任何需要多个连接的设施,那么您可以并且应该仅使用一个连接。
如果使用Redis的方式需要多个连接,并且只需要一个连接列表但不需要复杂的连接管理,则可以创建自己的工厂函数:它将调用redis.createClient()
并在返回之前保存客户端。然后在关闭时,您可以浏览已保存客户端的列表并关闭它们。不幸的是,BLPOP
没有提供内置的功能。
如果您需要比上述工厂功能更复杂的客户端管理,则管理创建的多个连接的典型方法是使用连接池,但是node-redis不提供连接池。我通常通过Python代码访问Redis,因此我不建议使用Node.js库,但是node-redis显示了很多候选对象。
答案 1 :(得分:0)
就设计和性能而言,最好创建一个客户端并在整个应用程序中使用它。这在节点中很容易做到。我假设您使用的是redis
npm软件包。
首先,创建一个名为redis.js
的文件,其内容如下:
const redis = require('redis');
const RedisClient = (function() {
return redis.createClient();
})();
module.exports = RedisClient
然后,在文件set.js
中说,您将这样使用它:
const client = require('./redis');
client.set('key', 'value');
然后,在您的index.js
文件中,可以将其导入并在退出时关闭连接:
const client = require('./redis');
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);
function cleanup() {
client.quit(function() {
console.log('Redis client stopped.');
server.stop(function() {
console.log('Server stopped.');
process.exit();
});
});
};
答案 2 :(得分:-1)
我认为只有一个连接更好。
module.exports = redis.createClient();
无需管理多连接。
表示redis。你可以使用redis-sentinel。
不过,你也可以使用ioredis