Как получить коллекцию, основанную на ключе wildchar redis, используя gem redis-rb? - PullRequest
0 голосов
/ 03 января 2012

Объекты redis, созданные с использованием камня redis-rb.

$redis = Redis.new
$redis.sadd("work:the-first-task", 1)
$redis.sadd("work:another-task", 2)
$redis.sadd("work:yet-another-task", 3)

Есть ли способ получить коллекцию с ключами "work: *"?

Ответы [ 2 ]

2 голосов
/ 03 января 2012

На самом деле, если вы просто хотите собрать коллекцию в Redis, вам нужен только один ключ.

В приведенном вами примере создаются 3 отдельные коллекции, каждая из которых состоит из одного элемента.Это, вероятно, не то, что вы хотели сделать.Пример можно переписать следующим образом:

$redis = Redis.new
$redis.sadd("work","the-first-task|1")
$redis.sadd("work", "another-task|2")
$redis.sadd("work", "yet-another-task|3")

Чтобы извлечь все элементы этой коллекции, используйте следующий код:

x = $redis.smembers("work")

Если вам необходимо отслеживать порядок следованияэлементов в вашей коллекции, было бы лучше использовать список вместо набора.

В любом случае использование команды KEYS должно быть ограничено только кодом инструментария / отладки.Он не предназначен для использования в реальном приложении из-за его линейной сложности.

Если вам действительно нужно собрать несколько коллекций и извлечь элементы из всех этих коллекций, возможно, лучшим способом является введение новой ".каталог "Коллекция для отслеживания ключей, соответствующих этим коллекциям.

Например:

$redis = Redis.new
$redis.sadd("catalog:work", "work:the-first-task" )
$redis.sadd("catalog:work", "work:another-task" )
$redis.sadd("work:the-first-task", 1)
$redis.sadd("work:the-first-task", 2)
$redis.sadd("work:another-task", 3)
$redis.sadd("work:another-task", 4)

Для эффективного извлечения всех элементов:

keys = $redis.smembers("catalog:work")
res = $redis.pipelined do
    keys.each do |x|
       $redis.smembers(x)
    end
end
res.flatten!(1)

Идеяэто выполнить первый запрос для получения содержимого каталога: работа, а затем выполнить итерацию по результату, используя конвейерную обработку для извлечения всех данных.Я не пользователь Ruby, поэтому, возможно, есть более идиоматический способ его реализации.

Другой более простой вариант можно использовать, если количество коллекций, которые вы хотите получить, ограничено, и если вам все равноо владении элементами (в каком наборе хранится каждый элемент)

keys = $redis.smembers("catalog:work")
res = $redis.sunion(*keys)

Здесь команда SUNION используется для построения набора в результате объединения всех интересующих вас наборов. Она также фильтруетдубликаты в результате (это не было сделано в предыдущем примере).

1 голос
/ 03 января 2012

Ну, я мог бы получить это $redis.keys("work:*").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...