LUAスクリプトを制限します:
ローカル key_local = redis.call(' setnx '、KEYS [ 1 ]、0 ) もし TONUMBER(key_local)== 0 その後、 場合 TONUMBER(redis.call(' 取得'、KEYS [ 1 ]))> = TONUMBERは(ARGV [ 2 ]) 、その後 返す 偽 他 redis.call(' INCR '、KEYS [ 1 ]) を返す 真 端 他 redis.call(' INCR '、KEYSは、[ 1 ]) redis.call(' pexpire '、キーは[ 1 ]、ARGVは、[ 1 ]) を返す 真 端を
Javaの呼び出しコード:
輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.core.io.ClassPathResource。 輸入org.springframework.data.redis.core.StringRedisTemplate。 輸入org.springframework.data.redis.core.script.DefaultRedisScript; 輸入org.springframework.scripting.support.ResourceScriptSource。 輸入org.springframework.stereotype.Component。 輸入java.util.Collections。 @成分 パブリック クラスGlobalLimitComponent { @Autowired プライベートStringRedisTemplate redisTemplate。 / ** * Luaのスクリプトの使用を制限するための鍵となります *使用Luaの利点は、複数のコマンドをラインに伝達されることを保証することができるとRedisのサーバは、シリアル実行順序は、他に挿入されていないことを確実にするために、シリアルに行われ、並行性の問題を回避します *ステップ: (m)は、いくつかの最大のため* 1キーが存在するかどうかを判断し、そうでない場合、1の値を設定し、キーを保存し、ミリ秒の数(N) 値が存在する場合* 2、タイムアウトが削除された場合、最初のキータイムアウトか否かを判定し、キーがタイムアウトしていない場合、上限ミリ秒がn回mを超えたか否かを判定し、ステップ1を再実行 * * @paramのキー * / パブリックブールgetGlobalLimitByLua(文字列のキー、int型 mlitimes、int型MAXCOUNT){ DefaultRedisScript <ブール> redisScript = 新しい DefaultRedisScript <> (); redisScript.setScriptSource(新しい ResourceScriptSource(新 ClassPathResource( "/ limit.lua" ))); redisScript.setResultType(ブール値。クラス); 戻りredisTemplate.execute(redisScript、Collections.singletonList(キー)、String.valueOf(mlitimes)、String.valueOf(MAXCOUNT))。 } }
最適化のポイント:LUAスクリプトは常にハッシュ値を取得するためにアップロードしていないが、Redisのサーバーにアップロードすることができ、各コールのハッシュ値が実行されます。