2013-04-07 11 views
11

レディスは、オプションを使用してSETをロックメカニズムとして使用する方法を推奨しています。私。 "SET lock 1 EX 10 NX"は、まだ存在していない場合にのみロックを設定し、10秒後に失効します。ノードRedis - EXとNXでSET?

set()メソッドを持つNode Redisを使用していますが、キーを期限切れにするための追加パラメータを渡す方法がわかりません。既に存在する場合、またはそれが作成されていても可能。

多分私はsetnx()とexpire()を別々の呼び出しとして使用する必要がありますか?

答えて

30

ノードRedisのソースコードを読んだ後、私はすべてのメソッドは、任意の数の引数を受け入れることがわかりました。誤った数の引数に関するエラーが生成されると、これはノードモジュールではなくRedisによって生成されます。

私は、Redis 2.2.xしかインストールされていないため、複数の引数を提供しようとしましたが、SETは2.6.12でNXとEXの引数を受け付けます。 Redisの2.6.12がインストールされて

ので、フォローのメソッド呼び出しは、それが5分後に期限切れになるように存在し、設定されていない場合は、変数を設定するには、ノードのRedisで動作します:

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

Luaスクリプトを使用して独自のsetnexコマンドを作成することができます。すべてのLuaスクリプトは原子的に実行されるため、スクリプトで既に読み込んだデータを変更する他のクライアントについて心配する必要はありません。

-- 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); 
}); 
関連する問題