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);
});