2014-02-11 10 views
11

Ich baue mein erstes Redis-Server-Side-Skript (zum Debuggen) und mein Mangel an Lua Erfahrung hat mich ziemlich fest.Lua-Skript für Redis, die die Werte der Schlüssel summiert

Im Wesentlichen haben Sie einen Datensatz von K/V-Paaren (enthält ~ 1000 Werte), von denen ich alle Schlüssel auflisten möchte, die einem Muster entsprechen. Zum Beispiel in redis-cli:

> KEYS "carlos:*" 
1) "carlos:1" 
2) "carlos:2" 
3) "carlos:3" 
4) "carlos:4" 

Basierend auf der obigen Ausgabe ich die Summe dieser Schlüssel zurückgeben möchten, indem ein Lua-Script ausgeführt wird. Zur Zeit habe ich folgendes auf meinem sum.lua

local sum = 0 
local matches = redis.call('KEYS', 'carlos:*') 

for unpack(matches) 
    sum = sum + redis.call('GET', matches) 
end 

return sum 

Während das obige Skript wahrscheinlich falsch ist, versuchen sogar redis.call('KEYS', 'carlos:*') selbst erzeugt den folgenden Fehler

root @ carlos: ~ # redis-cli EVAL $“ (cat sum.lua)“

(Fehler) ERR falsche Anzahl von Argumenten für 'eval' Befehl

I h habe eine Reihe von Wiederholungen meiner Syntax vergeblich versucht. Irgendwelche Ideen?

Dank

Antwort

19
  1. EVAL erfordert ein Minimum von zwei Argumente; das Skript und die Anzahl der Schlüssel, die Sie an das Skript übergeben. In diesem Fall sind vorbei Sie Null-Tasten können Sie das Skript Sinn aufgerufen werden, wie folgt:

    redis-cli EVAL "$(cat sum.lua)" 0 
    

    oder:

    redis-cli --eval sum.lua 
    
  2. Ihre Schleifenstruktur zur Iteration über die von KEYS zurückgegebenen Werte falsch war; Ich habe es für dich repariert.

  3. Sie müssen den von GET zurückgegebenen Wert von einer Zeichenfolge in eine Zahl konvertieren, indem Sie die tonumber-Funktion von Lua verwenden.

Mit den oben genannten Änderungen vorgenommen haben, sollten Sie das folgende Skript für Sie arbeiten:

local sum = 0 
local matches = redis.call('KEYS', 'carlos:*') 

for _,key in ipairs(matches) do 
    local val = redis.call('GET', key) 
    sum = sum + tonumber(val) 
end 

return sum 
+0

Beachten Sie, dass das Skript für immer in Redis zwischengespeichert werden, so sollten Sie in der Regel ARGV verwenden Argumente zu übergeben und nicht hart codieren Parameter wie 'carlos: *'. – CherryDT

Verwandte Themen