2013-10-24 3 views
1

У меня есть программа, которая хранит данные в Redis. Существует произвольное количество наборов, хранящихся в ключах под пространством имен «foo», т. Е. keys foo:* вернет список ключей наборов. Я хочу удалить строку «bar» из всех наборов, содержащих ее в пространстве имен. По существу (это в Ruby):Redis: удалить определенное значение из всех наборов

redis.keys("foo:*").each do |key| 
    redis.srem(key, "bar") 
end 

Благодаря использованию keys, которая не предназначена для использования в производстве, это неэффективно, а не атомные. Есть ли лучший способ удалить «бар» из всех наборов, учитывая, что у меня нет ключей наборов, которые я хочу использовать заранее?

Я был бы в порядке с использованием сценария Lua, если это единственный способ сделать атомарность и сделать ее работоспособной.

ответ

5

Способ сделать это будет иметь обратный поиск от строк до наборов.

  • В коде, который вставляет строку в набор, вы также вставляете имя набора в набор для этой строки. Например, вставка строки bar в набор foo:baz также приведет к введению значения foo:baz в набор foo:strings:bar или что-то в этом роде.

    Если заданные данные уже существуют, вы можете запустить однократное задание обратной засыпки путем простого повторения каждого набора и создания наборов string-> set_name.

  • Теперь, когда эти наборы есть, ваш код для удаления строки из наборов не является чем-то вроде:

    redis.smembers("foo:strings:#{string}").each do |set|  
        redis.srem(set, string) 
    end 
    

Вы теперь больше не делать полный просмотр таблицы ключей поиска.

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