2013-04-07 14 views
11

Redis empfiehlt die Verwendung von SET mit optionalen Parametern als Sperrmechanismus. I.e. "SET lock 1 EX 10 NX" wird nur dann eine Sperre setzen, wenn sie nicht bereits existiert und nach 10 Sekunden abläuft.Node Redis - SET mit EX und NX?

Ich benutze Node Redis, die eine set() -Methode hat, aber ich bin mir nicht sicher, wie Sie die zusätzlichen Parameter übergeben, damit der Schlüssel abläuft und nicht erstellt wird, wenn es bereits existiert, oder auch wenn es ist möglich.

Vielleicht muss ich setnx() und expire() als separate Aufrufe verwenden?

Antwort

30

Nachdem der Knoten Redis Quellcode zu lesen, fand ich, dass alle Methoden eine beliebige Anzahl von Argumenten akzeptieren . Wenn ein Fehler bezüglich einer inkorrekten Anzahl von Argumenten erzeugt wird, wird dies von Redis nicht durch das Knotenmodul erzeugt.

Meine frühen Versuche, mehrere Argumente zu liefern, waren, weil ich nur Redis 2.2.x installiert hatte, wo SET die Argumente NX und EX nur mit 2.6.12 akzeptiert. So

mit Redis 2.6.12 installiert, werden die Folgemethodenaufrufe mit Knoten redis arbeiten, um eine Variable zu setzen, wenn es nicht vorhanden ist und legen Sie es nach 5 Minuten verstreichen:

$client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...}); 
$client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...}); 
3

Sie können ein Lua-Skript verwenden, um Ihren eigenen setnex-Befehl zu erstellen. Alle Lua-Skripts werden automatisch ausgeführt, sodass Sie sich keine Sorgen darüber machen müssen, dass andere Clients Daten ändern, die Sie bereits im Skript gelesen haben.

-- setnex.lua 
local key = ARGV[1] 
local expiry = ARGV[2] 
local value = ARGV[3] 
local reply = redis.call("SETNX", key, value) 
if 1 == reply then 
    redis.call("EXPIRE", key, expiry) 
end 
return reply 

Sie können es von node_redis wie folgt aufrufen:

client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) { 
    console.dir(err); 
    console.dir(res); 
});