假设您在 Redis 中有 多个 db,您希望从中插入和/或删除数据。你有这样的流程;
- 将数据插入到 DB #1
- 在第一次插入的回调之后做一些事情并将数据插入到DB #2
- 在第二次插入的回调之后再次做一些事情,最后将数据插入到DB #3
我使用一个名为 redisClient 的变量,它基本上被创建为;
redisClient = redis.createClient();
在选择新数据库时,我使用 select 命令和额外的预警回调,所以我的选择命令就像;
redisClient.select(1, function(err) {
//Some programming logic (Insertion, deletion and stuff)
redisClient.select(2, function(err) {
//Do some additional programming logic (Insertion, deletion and stuff)
}
});
然而,事情总是变得复杂。我想指出 redisClient 变量只分配了一次,然后在整个应用程序中使用。现在我想知道,为我在 Redis 中拥有的每个 DB 使用 单独的 redisClients 会有多合理。所以它会像;
redisClientForDB1 = redis.createClient();
redisClientForDB2 = redis.createClient();
redisClientForDB3 = redis.createClient();
我想知道这是否合理,或者对于将接收 每秒 4K 请求并即将进入生产模式的应用程序来说,这是否是正确的方法。该模型可能面临哪些问题?
最佳答案
就像 Carl Zulauf said ,最好打开 3 个不同的连接(每个 DB 一个):
redisClient = {
DB1: redis.createClient(),
DB2: redis.createClient(),
DB3: redis.createClient()
};
最好在服务器初始化期间打开所有连接一次:
async.parallel([
DB1.select.bind(DB1, 1),
DB2.select.bind(DB2, 2),
DB3.select.bind(DB3, 3)
], next);
因此,在您创建 redisClient
对象并对其进行初始化之后,您就可以使用它来处理您的所有 redis 操作了。
如果您以这种方式使用 redis, Node 将为每个 Node 进程打开 3 个(且仅 3 个)连接。
注意将它们全部放在一个 Node 模块中也是一个好主意:
module.exports = {
DB1: redis.createClient(),
DB2: redis.createClient(),
DB3: redis.createClient(),
init: function(next) {
var select = redis.RedisClient.prototype.select;
require('async').parallel([
select.bind(this.DB1, 1),
select.bind(this.DB2, 2),
select.bind(this.DB3, 3)
], next);
}
};
然后你就可以通过调用一次init
函数来初始化你所有的redis连接(因为 Node 缓存了require
调用):
require('./lib/my_redis').init(function(err) {
if (err) throw err;
server.listen();
});
然后当 require('./lib/my_redis').DB1.set('key','val')
将在您的任何模块中调用 DB1
将已经初始化。
关于javascript - Node 和 Redis : Redis Clients,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971145/