Это не прямой ответ на вопрос, но, поскольку я попал сюда при поиске своих собственных ответов, я поделюсь этим здесь.
Если у вас есть десятки или сотни миллионов ключей, которым вы должны соответствовать, ответы, приведенные здесь, приведут к тому, что Redis не будет отвечать на запросы в течение значительного времени (минут?), И потенциально может произойти сбой из-за потребления памяти (будьте уверены, сохранение фона начнется в середине вашей операции).
Следующий подход, несомненно, безобразен, но лучшего я не нашел. Атомность здесь не обсуждается, в этом случае главная цель - поддерживать Redis в рабочем состоянии и реагировать на него 100% времени. Он будет отлично работать, если у вас есть все ключи в одной из баз данных, и вам не нужно сопоставлять какой-либо шаблон, но вы не можете использовать http://redis.io/commands/FLUSHDB из-за его природы блокировки.
Идея проста: написать скрипт, который выполняется в цикле и использует операцию O (1), такую как http://redis.io/commands/SCAN или http://redis.io/commands/RANDOMKEY, чтобы получить ключи, проверяет, соответствуют ли они шаблону (если вам нужно это) и http://redis.io/commands/DEL их один за другим.
Если есть лучший способ сделать это, пожалуйста, дайте мне знать, я обновлю ответ.
Пример реализации с помощью randomkey в Ruby, как задача rake, неблокирующая замена чего-то вроде redis-cli -n 3 flushdb
:
desc 'Cleanup redis'
task cleanup_redis: :environment do
redis = Redis.new(...) # connection to target database number which needs to be wiped out
counter = 0
while key = redis.randomkey
puts "Deleting #{counter}: #{key}"
redis.del(key)
counter += 1
end
end