今天,我将Redis集成到我的node.js应用程序中,并将其用作会话存储。基本上,在身份验证成功后,我将相应的user对象存储在Redis中。
当我在身份验证后收到http请求时,我尝试使用散列从Redis检索user对象。如果检索成功,则意味着用户已登录,并且可以满足请求。
在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();
});
};发布于 2019-04-09 11:41:32
在设计和性能方面,最好创建一个客户端并在整个应用程序中使用它。在node中很容易做到这一点。我假设您使用的是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();
});
});
};发布于 2019-04-10 19:15:59
根据应用程序使用Redis的方式,使用多个连接可能是所需的。
例如,一旦连接用于侦听发布/订阅通道,则它只能用于此通道,而不能用于其他通道。根据SUBSCRIBE上的文档
客户端一旦进入subscribed状态,就不应发出任何其他命令,但附加的
SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE命令除外。
因此,如果您的应用程序需要订阅频道并使用Redis作为通用的值缓存,那么它至少需要两个客户端:一个用于订阅频道,另一个用于使用Redis作为缓存。
还有一些Redis命令会被阻塞,比如BLPOP。繁忙的web服务器通常一次回复多个请求。假设对于应答请求A,服务器使用其Redis客户端发出阻塞命令。然后请求B来了,服务器需要用非阻塞命令应答Redis,但客户端仍在等待请求A下发的阻塞命令完成。现在,对请求B的响应被另一个请求延迟。这可以通过对第二个请求使用不同的客户端来避免。
如果您不使用任何需要多个连接的工具,那么您可以并且应该只使用一个连接。
如果您使用Redis的方式需要多个连接,并且您只需要一个连接列表,而不需要复杂的连接管理,那么您可以创建自己的工厂函数:它将调用redis.createClient()并在返回客户端之前保存它。然后,在关闭时,您可以查看已保存客户端的列表并将其关闭。不幸的是,node-redis没有提供这样的内置功能。
如果您需要比上述工厂功能更复杂的客户端管理,那么管理创建的多个连接的典型方法是使用连接池,但node-redis不提供连接池。我通常通过Python代码访问Redis,所以我没有对Node.js库的推荐,但是npm search显示了相当多的候选库。
https://stackoverflow.com/questions/20895063
复制相似问题