Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Löschen Sie Redis-Hash-Werte in großen Mengen basierend auf dem Hash-Schlüsselnamen

Das folgende EVAL-Skript sollte das tun, was Sie wollen:

local keys = redis.call('KEYS',KEYS[1])
for i,k in ipairs(keys) do
    local res = redis.call('HKEYS',k)
    for j,v in ipairs(res) do
        if string.find(v,ARGV[1]) then
            redis.call('HDEL',k,v)
        end
    end
end

Sie müssen es aufrufen, indem Sie die folgenden Parameter angeben:

EVAL <script> 1 prefix:* cc_..

Bitte beachten Sie, dass die Redis-Ereignisschleife blockiert wird, bis das Skript abgeschlossen ist, sodass Redis für eine Weile einfrieren kann, wenn Sie eine große Anzahl von Schlüsseln haben. Atomizität hat ihren Preis.

Aktualisierung:

Wenn Sie die Atomarität nicht benötigen, verhindert das folgende Skript, dass Redis zu lange blockiert wird (aber beachten Sie bitte, dass es immer noch blockiert, wenn Sie eine große globale Anzahl von Schlüsseln haben oder wenn eines Ihrer Hash-Objekte riesig ist:es gibt keine Möglichkeit, dies zu vermeiden).

./redis-cli keys 'prefix:*' | awk '
BEGIN {
    script = "local res = redis.call('\''HKEYS'\'',KEYS[1]); \
          for j,v in ipairs(res) do                          \
            if string.find(v,ARGV[1]) then                   \
              redis.call('\''HDEL'\'',KEYS[1],v);            \
            end                                              \
          end"
}
{
    printf "EVAL \"%s\" 1 %s cc_..\n", script, $1
}' | ./redis-cli

(getestet mit bash)