寻找与node.js一起使用redis的有效方法

时间:2013-12-12 04:22:29

标签: node.js redis

我已经使用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似乎相当麻烦。

1 个答案:

答案 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的一个示例中显示(作为注释;容易遗漏)。