2013-04-07 11 views
11

Redis consiglia un metodo per utilizzare SET con parametri facoltativi come meccanismo di blocco. Cioè "SET lock 1 EX 10 NX" imposterà un lock solo se non esiste già e scadrà dopo 10 secondi.Node Redis - SET con EX e NX?

Sto usando Node Redis, che ha un metodo set(), ma non sono sicuro di come passarlo i parametri aggiuntivi per far scadere la chiave e non essere creato se esiste già, o anche se è possibile.

Forse dovrei usare setnx() e expire() come chiamate separate?

risposta

30

Dopo aver letto il codice sorgente Nodo Redis, ho scoperto che tutti i metodi accettano un numero arbitrario di argomenti . Quando viene generato un errore relativo al numero errato di argomenti, questo viene generato da Redis, non dal modulo nodo.

I miei primi tentativi di fornire più argomenti erano perché avevo installato Redis 2.2.x, dove SET accetta solo gli argomenti NX ed EX con 2.6.12.

Quindi, con Redis 2.6.12 installato, le chiamate di metodo seguito lavorerà con Redis nodo per impostare una variabile se non esiste e impostarlo per scadere dopo 5 minuti:

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

È possibile utilizzare uno script Lua per creare il proprio comando setnex. Tutti gli script Lua vengono eseguiti in modo atomico per cui non devi preoccuparti di altri client che modificano i dati che hai già letto nello script.

-- 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 

Si può chiamare da node_redis in questo modo:

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