キャッシュは、高い同時実行読み取り - 変更操作がアトミック操作を必要とし、Redisの自体は、例えばincrby、オーダー(減少)を増加させるが、これらのコマンドは、いくつかの操作に適用されない、このような状況からhincrbyのコマンドの数を提供しますそれは、複数のコマンドを実行するのluaスクリプトを使用することができます下(読み取り、書き込み)。
次のluaスクリプトは、スクリプトのLUAは、通常は一度だけロードされ、その後、操作Redisので返されたハッシュ値を使用します。
ローカルローカル= redis.callが(' 存在'、KEYSは、[ 1 ]) 場合 TONUMBER(ローカル)== 0は、 次に 戻り 偽 エンドを 場合 TONUMBER(redis.call(' 取得'、KEYS [ 1 ]))<= 0 次いで、 リターン 偽 端 なら TONUMBER(ARGV [ 1 ])> 0 、次いで (redis.call ' incrby 'キーは[ 1 ]、ARGVは、[ 1 ]) を返す 真 それ以外の 場合 TONUMBER(redis.call(' 取得'、KEYS [ 1 ]))> = TONUMBER(ARGV [ 1 ]) 、その後 (redis.call ' incrbyを' KEYS [ 1 ARGVは[、] 1 ]) を返す 真の 他の リターンを
偽
エンド・ エンド
スクリプトは、読みと在庫を修正し、スクリプトはファイル内のリソースの一元管理をクリッピングすることができます実装します。
Javaコード:
してみてください{ DefaultRedisScript <ブール> redisScript = 新しい DefaultRedisScript <> (); redisScript.setScriptSource(新しい ResourceScriptSource(新 ClassPathResource( "/ limit.lua" ))); redisScript.setResultType(ブール値。クラス); 戻りredisTemplate.execute(redisScript、Collections.singletonList(キー)、String.valueOf(mlitimes)、String.valueOf(MAXCOUNT))。 } キャッチ(IOExceptionを電子){ e.printStackTrace(); }
フォーカス:クラスタモードでは、ノードのみがアップロードされたスクリプト内の他のノードに見つけることができませんならば、スクリプトがあるかどうかではない場合、再アップロードのluaスクリプトを決定する必要があります。