RedisのLUAスクリプトアプリケーション

  キャッシュは、高い同時実行読み取り - 変更操作がアトミック操作を必要とし、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スクリプトを決定する必要があります。

 

おすすめ

転載: www.cnblogs.com/use-D/p/11746280.html