Node Redis - SET с EX и NX?

Redis рекомендует использовать метод SET с дополнительными параметрами в качестве механизма блокировки. То есть "Блокировка SET 1 EX 10 NX" устанавливает блокировку только в том случае, если она еще не существует и истекает через 10 секунд.

Я использую Node Redis, у которого есть метод set(), но я не уверен, как передать ему дополнительные параметры для истечения срока действия ключа и не создаваться, если он уже существует, или даже если это возможно.

Возможно, мне нужно использовать setnx() и expire() в качестве отдельных вызовов?

Ответ 1

После чтения исходного кода Node Redis я обнаружил, что все методы принимают произвольное количество аргументов. Когда генерируется ошибка о некорректном числе аргументов, это генерируется Redis не модулем Node.

Мои ранние попытки предоставить несколько аргументов состояли в том, что я установил только Redis 2.2.x, где SET принимает только аргументы NX и EX с 2.6.12.

Таким образом, если установлен Redis 2.6.12, последующие вызовы методов будут работать с Node redis, чтобы установить переменную, если она не существует, и истечь через 5 минут:

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

Ответ 2

Вы можете использовать Lua script, чтобы создать свою собственную команду setnex. Все сценарии Lua работают атомарно, поэтому вам не нужно беспокоиться о том, что другие клиенты меняют данные, которые вы уже прочитали в 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

Вы можете вызвать его из node_redis следующим образом:

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