我已经使用redis和node.js为聊天室编写了一些示例,但在继续这条路径之前,我想知道这是否是最好的方法:
var redis = require('redis')
, cache = redis.createClient(cfg.redis_port, cfg.redis_host)
function getUsers(cb){
cache.select(cfg.redis_db, function(err, status){
cache.get('chat.users', function(err, data){
var users = data && JSON.parse(data) || [];
c.log('get users', users);
cb(users);
});
});
}
function addUser(user, cb){
getUsers(function(users){
users.push(user);
cache.select(cfg.redis_db, function(err, status){
cache.set('chat.users', JSON.stringify(users), function(){
c.log('cache set', arguments);
c.log('add user', user, users);
cb(users);
});
});
});
}
function removeUser(user, cb){
getUsers(function(users){
users = _.reject(users, function(val){
return user.nick === val.nick;
});
cache.select(cfg.redis_db, function(err, status){
cache.set('chat.users', JSON.stringify(users), function(){
c.log('cache set', arguments);
c.log('remove user', user, users);
cb(users);
});
});
});
}
我问的原因是,cache.select
之后到处cache.get
似乎相当麻烦。
答案 0 :(得分:1)
在Redis中,一旦选择了数据库,它将保持选中状态,直到发出另一个SELECT
。并且因为Node Redis客户端将在客户端准备好之前发出的命令排队,所以您可以执行以下操作:
var redis = require('redis')
, cache = redis.createClient(cfg.redis_port, cfg.redis_host);
cache.select(cfg.redis_db);
// the rest of your code
它看起来并不像Node-ish,但它可以工作并在node-redis home page的一个示例中显示(作为注释;容易遗漏)。