使用此库: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。
这可能吗?如果是这样,有人可以指导我如何做到这一点吗?
由于
答案 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
})
}