2017-02-03 4 views
0

Используя эту библиотеку: https://github.com/NodeRedis/node_redisКак выполнить поиск набора redis и вернуть ключ, если в наборе содержится больше элементов x?

Вот пример моего кода:

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, который имеет более членов х ,

Например, если я ищу ключ любого из list, который имеет более 1 члена, он будет возвращать список: 3.

Возможно ли это? Если да, может ли кто-нибудь направить меня на то, как я буду заниматься этим?

Благодаря

ответ

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 
     }) 
} 
+0

Есть ли способ, чтобы ограничить его так что он возвращает первый найденный ключ, который соответствует критериям, а затем останавливается? благодаря! –

+0

Потому что я использую трубопровод для поиска всех сразу и возвращаюсь ко мне. Однако, если вы хотите сделать это по-своему, вы можете передать массив Promises (операция scard, throw if 0) в bluebird 'Promise.any', и он остановится, как только найдет список с 1 элементом. –

+0

'Promise.any' api http://bluebirdjs.com/docs/api/promise.any.html –

 Смежные вопросы

  • Нет связанных вопросов^_^