如果集合中有多于x个成员,如何搜索redis集并返回密钥?

时间:2017-02-03 08:14:06

标签: node.js redis

使用此库:https://github.com/NodeRedis/node_redis

以下是我的代码示例:

redisdb.sadd("list", "list:1");
redisdb.sadd("list:1", "list:1:stuff:abc");
redisdb.sadd("list", "list:2");
redisdb.sadd("list", "list:3");
redisdb.sadd("list:3", "list:3:stuff:def");
redisdb.sadd("list:3", "list:3:stuff:def");
redisdb.sadd("list", "list:4");
redisdb.sadd("list", "list:5");
redisdb.sadd("list", "list:6");
redisdb.sadd("list", "list:7");
redisdb.sadd("list", "list:8");
redisdb.sadd("list", "list:9");
redisdb.sadd("list", "list:10");
redisdb.sadd("list", "list:11");
redisdb.sadd("list", "list:12");
redisdb.sadd("list", "list:13");
redisdb.sadd("list", "list:14");
redisdb.sadd("list", "list:15");

我想说我想搜索名为list的集合,并获取list中包含x个以上成员的任何集合的密钥。

例如,如果我要查找list中任何具有1个以上成员的集合的密钥,它将返回列表:3。

这可能吗?如果是这样,有人可以指导我如何做到这一点吗?

由于

1 个答案:

答案 0 :(得分:1)

我正在使用ioredis,但这个想法很相似。

redis.smembers('list')
    .then(function (members) {
        console.log('members', members);

        var pipeline = redis.pipeline()

        members.map(function (key) {
            pipeline.scard(key)    
        })

        return pipeline.exec()
    })
    .then(function (counts) {
        console.log('counts', counts);
    })

输出:

members [ 'list:12',
  'list:1',
  'list:11',
  'list:8',
  'list:10',
  'list:7',
  'list:3',
  'list:9',
  'list:15',
  'list:5',
  'list:14',
  'list:2',
  'list:13',
  'list:6',
  'list:4' ]
counts [ [ null, 0 ],
  [ null, 1 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 1 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ],
  [ null, 0 ] ]    

或者如果您想按照自己的方式进行操作:一旦找到非空列表就停止

var Redis = require('ioredis');
var redis = new Redis();
var Promise = require('bluebird');

redis.smembers('list')
    .then(function (members) {
        console.log('members', members);

        var allPromises = members.map(function (key) {
            return getMemberCount(key)
        })

        return Promise.any(allPromises)
    })
    .then(function (listName) {
        console.log('found', listName);
    })

function getMemberCount(key) {
    return redis.scard(key)
        .then(function (cnt) {
            if (cnt === 0) throw new Error('empty set')
            else return key
        })   
}