使用这个库: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个成员的任何集合的键,它将返回list:3。
这个是可能的吗?如果是这样的话,有没有人能告诉我该怎么做呢?
谢谢
发布于 2017-02-03 16:35:30
我使用的是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
})
}https://stackoverflow.com/questions/42019621
复制相似问题