2014-05-08 2 views
0

En Redis, nous pouvons utiliser comme joker,Suppression d'un attribut de hachage avec Redis joker

KEYS foo* -> pour trouver les clés.

Maintenant, je veux supprimer le champ particulier de hashmap en utilisant un caractère générique. Pensez à suivre par exemple. créer hashmap

HMSET myhash f "g" field1 "Hello" field2 "World" 

maintenant je veux supprimer la clé en utilisant comme joker

DEL myha* 

Est-il possible?

Aussi je veux supprimer domaine particulier de SET en utilisant comme joker

DEL myhash field* 

Est-ce possible?

Merci d'avance.

+0

Pour DEL Myha *, vous pouvez consulter http://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching- a-pattern-using-redis. Mais pour le champ DEL myhash *, j'ai bien peur que vous ayez besoin d'un script pour le faire. –

+0

@BrandonGao thnx homme de prendre intérêt. Donc c'est possible. Pouvez-vous donner un exemple ou un lien vers une ressource? – userx

+1

vous pouvez vous référer à l'original redis doc pour écrire le script. Mais je pense que vous devez utiliser HDEL pour votre deuxième question. –

Répondre

1

Pour supprimer des champs particuliers de SET à l'aide des caractères génériques, vous pouvez utiliser ce script LUA:

-- ARGV[1] - hash key 
-- ARGV[1] - lua pattern 
local fields = redis.call("HKEYS", ARGV[1]); 
local retVal = {}; 
for key, value in pairs(fields) do 
    if (string.match(value, ARGV[2])) then 
     table.insert(retVal, value); 
     redis.call("HDEL", ARGV[1], value); 
    end 
end 

return retVal; 

Ce script a la complexité O (n). Le script retourne les champs supprimés correspondant à un modèle donné. Regardez string.match tutorial pour les caractéristiques correspondant à lua pattern.

Exemple d'utilisation en PHP avec phpredis:

$r = new Redis(); 
$r->connect('127.0.0.1'); 

for ($i = 1; $i < 1000; $i++) { 
    $r->hSet('myhash', 'aaa' . mt_rand(0, PHP_INT_MAX), 1); 
} 
$r->hSet('myhash', 'bad', 1); 

$script = <<< SCR 
    local fields = redis.call("HKEYS", ARGV[1]); 
    local retVal = {}; 
    for key, value in pairs(fields) do 
     if (string.match(value, ARGV[2])) then 
      table.insert(retVal, value); 
      redis.call("HDEL", ARGV[1], value); 
     end 
    end 

    return retVal; 
SCR; 

var_dump($r->eval($script, ['myhash', '^b.+']));