Удаление нескольких ключей в redis-rb - PullRequest
16 голосов
/ 19 мая 2011

Используя redis-rb в приложении Rails, следующее не работает:

irb> keys = $redis.keys("autocomplete*")
=> ["autocomplete_foo", "autocomplete_bar", "autocomplete_bat"]
irb> $redis.del(keys)
=> 0

Это отлично работает:

irb> $redis.del("autocomplete_foo", "autocomplete_bar")
=> 2

Я что-то упускаю из виду? Источник просто:

# Delete a key.
def del(*keys)
  synchronize do
    @client.call [:del, *keys]
  end
end

, который мне кажется, что он должен работать, чтобы передать массив ...?

Ответы [ 3 ]

32 голосов
/ 19 мая 2011

Небольшое исследование кодирования работы оператора splat:

def foo(*keys)
  puts keys.inspect
end

>> foo("hi", "there")
["hi", "there"]

>> foo(["hi", "there"])
[["hi", "there"]]

>> foo(*["hi", "there"])
["hi", "there"]

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

$redis.del(*keys)

Это позволяет методу знать распаковать его / не принимать никаких дальнейших аргументов. Так что это должно решить вашу проблему!

Просто для дальнейшего уточнения, это работает:

>> foo("hello", *["hi", "there"])

Это вызывает синтаксическую ошибку:

>> foo("hello", *["hi", "there"], "world")
12 голосов
/ 02 ноября 2013

Для приложения Rails, над которым я работаю, мне нужно было проверить результаты загрузки и выгрузки данных redis.

Пространство имен определяется средой, избегая взаимодействия с разработкой.Это сработало хорошо.

def clear_redis_cache
  keys = $redis.keys "#{namespace}*"
  $redis.del(*keys) unless keys.empty?
end
0 голосов
/ 10 июля 2019

Этого лучше достичь, используя перечислитель, возвращаемый scan_each.

scan_each(match: 'autocomplete_*').each do |key|
  del key
end

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

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