首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何搜索redis集合,如果集合中有x个以上的成员,如何返回key?

如何搜索redis集合,如果集合中有x个以上的成员,如何返回key?
EN

Stack Overflow用户
提问于 2017-02-03 16:14:06
回答 1查看 506关注 0票数 0

使用这个库:https://github.com/NodeRedis/node_redis

下面是我的代码示例:

代码语言:javascript
复制
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个成员的任何集合的键,它将返回list:3。

这个是可能的吗?如果是这样的话,有没有人能告诉我该怎么做呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-03 16:35:30

我使用的是ioredis,但想法是相似的。

代码语言:javascript
复制
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);
    })

输出:

代码语言:javascript
复制
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 ] ]    

或者,如果你想按你自己的方式去做:一旦找到一个非空的列表就停止

代码语言:javascript
复制
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
        })   
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42019621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档