19

SETRedis では、ロック メカニズムとしてオプションのパラメーターを使用する方法を推奨しています。つまりSET lock 1 EX 10 NX、ロックがまだ存在しない場合にのみロックを設定し、10 秒後に有効期限が切れます。

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

おそらくsetnx()、 andexpire()を別の呼び出しとして使用する必要がありますか?

4

3 に答える 3

48

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

初期に複数の引数を指定しようとしたのは、Redis 2.2.x しかインストールされていなかったためで、SET は 2.6.12 で NX および EX 引数のみを受け入れます。

そのため、Redis 2.6.12 がインストールされている場合、次のメソッド呼び出しはノード redis で機能し、存在しない場合は変数を設定し、5 分後に有効期限が切れるように設定します。

$client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...});
$client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...});
于 2013-04-30T09:52:57.733 に答える
5

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);
});
于 2013-04-17T16:54:39.877 に答える