2017-01-20 6 views
2

En raison de la performance, j'ai besoin de réduire le nombre de sauts à Redis. Je fais appel HMSET plusieurs fois à partir du code C++ et j'étudie si elle est poosible de changer cela en utilisant le script Lua et définir des clés de hachage Redis avec un appel à Redis:Plusieurs HMSET à Redis avec script Lua

HMSET myhash1 field1 "Hello" field2 "World" 
HMSET myhash2 field1 "Hello" field2 "World" 
HMSET myhash3 field1 "Hello" field2 "World" 
... 
HMSET myhashN field1 "Hello" field2 "World" 

Comment puis-je passer au script plusieurs clés de hachage et plusieurs champs/valeurs?

== Mise à jour Sur la base de commentaires Itamar Haber, je me suis dit que mon problème était la virgule avec un espace manquant entre les clés et les valeurs argv -

J'ai fini le script suivant:

local k = 1 
for i=1, #KEYS do 
    if redis.call('hmset', KEYS[i], ARGV[k], ARGV[k+1], ARGV[k+2], ARGV[k+3]) == 1 then 
     return 1 
    end 
    k = k + 4 
end                                                
return 0 

redis-cli --eval /var/tmp/script.lua myhash1 myhash2 , field1 "Hello" field2 "World" field1 "Hello" field2 "World" 

Je ne suis pas sûr si elle peut être optimisée davantage pour éviter de répéter les noms de champs ou de passer un nombre arbitraire de champs/valeurs pour chaque clé.

Répondre

1

Pour minimiser les sauts, vous pouvez utiliser le pipelining à la place - plus simple et avec l'effet désiré. Un script peut également minimiser les sauts. Utilisez le tableau KEYS pour transmettre les noms de clé de hachage au script et le tableau ARGV pour fournir les champs et les valeurs.

+0

Salut @Itamar Haber, merci pour votre réponse. Malheureusement, le client nekipelov/redisclient que j'utilise ne supporte pas le pipelining. – gliatsos

+0

Alors utilisez un script;) Avez-vous besoin d'un exemple? –

+0

Mon principal problème est de savoir comment passer les clés de hachage dans KEYS et les valeurs de champs à l'ARGV. Toutes mes tentatives à ce jour remplissent KEYS mais ARGV est vide. Pouvez-vous me référer à un exemple? Je vous remercie! – gliatsos