2013-08-15 2 views
2

Я ищу эффективную функцию для очистки кеша redis.Максимальная арность функции рубина?

У меня есть вызов метода, который возвращает количество ключей от Redis:

$redis.keys("foo:*") 

Это возвращает все ключи, которые начинаются с «Foo:». Затем я хотел бы удалить все значения для этих ключей.

One (много памяти) способ сделать это:

$redis.keys("foo:*").each do |key| 
    $redis.del(key) 
end 

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

Другой способ, который мне нравится использовать оператор пейнтбольный:

keys = $redis.keys("foo:*") 
$redis.del(*keys) 

Проблема заключается в том, что я не знаю, что максимальная арностью метода $redis.del, ни какого-либо метода рубина, я могу» t, похоже, найти его в Интернете.

Какова максимальная арность?

+0

Я получаю «SystemStackError: уровень стека слишком глубокий» для более чем 130_000 аргументов на моей машине. –

+0

То же самое для меня. И иногда рубины сильно падают: https://gist.github.com/DNNX/6243859 – DNNX

+1

Вероятно, есть место для улучшения реализации ... В частности, когда предоставлен только один аргумент splat, его можно просто назначить 'args' вместо того, чтобы делать некоторые рекурсивные вещи под капотом. –

ответ

0

@muistooshort в комментариях было хорошее предложение, что оказалось правильным, водитель Redis знает, что делать с аргументом массива:

# there are 1,000,000 keys of the form "foo:#{number}" 
keys = $redis.keys("foo:*") 
$redis.del(keys) # => 1000000 

Просто передать массив ключей $redis.del

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