【问题标题】:Getting 10 random items using Node & Redis使用 Node 和 Redis 获取 10 个随机项目
【发布时间】:2013-01-03 08:40:55
【问题描述】:

我正在尝试找出如何最好地从 Mongo 集合中获取一组 10 个随机项目。我的计划是在 Redis 中存储一组 Mongo ID,使用 Redis SRANDMEMBER 命令获取 10 个随机 ID,然后从 Mongo 集合中获取。

由于我使用的是 Node,我无法使用 SRANDMEMBER 10,因为节点“redis”包不接受可选的第二个参数。

我真正遇到的问题是如何以异步友好的方式做到这一点。我试过使用node异步库提供的几个工具,比如Waterfall和While,但是Redis调用总是比数据来得晚。


编辑#2:

为了响应下面的帮助,我将我的功能细化如下:

client.send_command("SRANDMEMBER", ["album_id_set", "10"], function(err, results) {
    if (err) console.log('Redis error: ' + err);
    Album.find({
        '_id' : { $in: results }
    }, function(err, result){
        if (err) console.log('Mongo error: ' + err);
        response.json(result);
    });
});

【问题讨论】:

    标签: node.js mongodb redis


    【解决方案1】:

    使用redisnode-redis 包的解决方案是发送原始命令。
    我已经测试了这两个软件包并且都对我有用。

    使用 node-redis 包

    https://github.com/tim-smart/node-redis

    node-redis 返回一个缓冲区对象数组。

    client.sendCommand('SRANDMEMBER', ['album_id_set', '10'], function(err, reply) {
        for (var i = 0; i < reply.length; i++) {
            console.log(reply[i].toString());
        };
    });
    

    使用redis包

    https://github.com/mranney/node_redis

    redis 返回一个字符串数组。

    client.send_command('SRANDMEMBER', ['album_id_set', '10'], console.log);
    

    有关详细信息,请参阅 send_command 文档。

    【讨论】:

    • 这看起来是正确的想法。我一直无法让它工作,它抱怨“srandmember 的参数数量错误”。你取得了更大的成功吗?
    • @DonH 只是为了确认一下,您使用的是redis 模块(我链接到的)还是github.com/Tim-Smart/node-redisnode-redis 模块?它适用于我使用 redis 模块。
    • 感谢您的帮助和编辑 myanimal,非常感谢。我正在使用“redis”模块。我尝试了上面的示例,但仍然存在太多参数错误。我已将我的代码作为编辑放入以防万一?
    • @DonH,我怀疑它可能是您使用的 Redis 服务器版本 (redis-server -v)。 SRANDMEMBER 的第二个参数是最近才添加的。我使用您的代码针对 2.6.7 版本进行了测试。
    • 好收获。我更新到 2.6.9 并且运行良好。我已经调整了我的原始问题以包含解决问题的代码。比下面的瀑布优雅多了!谢谢。
    猜你喜欢
    • 2013-05-14
    • 2017-12-22
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多