2013-04-07 9 views
11

Redis zaleca stosowanie metody SET z opcjonalnymi parametrami jako mechanizmu blokującego. To znaczy. "SET lock 1 EX 10 NX" ustawi blokadę tylko wtedy, gdy jeszcze nie istnieje i wygaśnie po 10 sekundach.Węzeł Redis - SET z EX i NX?

Używam węzła Redis, który ma metodę set(), ale nie wiem, jak przekazać mu dodatkowe parametry, aby klucz wygasł i nie został utworzony, jeśli już istnieje, lub nawet jeśli jest możliwy.

Być może muszę użyć setnx() i expire() jako oddzielnych połączeń?

Odpowiedz

30

Po odczytaniu kodu źródłowego węzła Redis, stwierdziliśmy, że wszystkie metody przyjąć dowolną liczbę argumentów . Gdy generowany jest błąd dotyczący niepoprawnej liczby argumentów, jest on generowany przez moduł Redis, a nie przez moduł węzła.

Moje wczesne próby dostarczenia wielu argumentów były spowodowane tym, że zainstalowałem tylko Redis 2.2.x, gdzie SET akceptuje tylko argumenty NX i EX z 2.6.12.

Więc z Redis 2.6.12 zainstalowany, wywołania metod obserwacji będzie współpracować z REDiS węzłów ustawić zmienną, jeśli nie istnieje i ustawić go wygasają po 5 minutach:

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

Możesz użyć skryptu Lua, aby wykonać własne polecenie setnex. Wszystkie skrypty Lua działają atomowo, więc nie musisz się martwić o innych klientów zmieniających dane, które już przeczytałeś w skrypcie.

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

Można zadzwonić z node_redis tak:

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