私たちのプロジェクトでは、redisのincrコマンドを使ってストレージを制限したいと考えています。たとえば、特定の商品Aについては、プロモーション中に10個のみを販売したいと考えています。そこで、incrコマンドを使用して0から10までのストレージ値を追加することを計画しました。理論的には、このシナリオではこの計画は問題ありません。redis incrコマンドは特定の番号に制限されますか?
開始する前に、incrコマンドのパフォーマンステストを行いました。その結果、incrを使用して商品保管庫の制限を行うことは実現できない可能性がありました。以下
テストコード:
static int count = 0;
public void performanceToken() throws RedisAccessException {
long result = redisUtil.incrRedisEx("myrrrxxxrrrediskey6");
if (result <= 10) {
count ++;
}
Struts2Utils.renderJson(result +"|"+count);
return;
}
incrRedisExはINCRコマンドのラッパーだったと我々は我々のJavaプロジェクトで、私たちのRedisを駆動するドライバとしてjedisを使用しました。
次に、私たちはtomcatを開始し、私たちは上記のインターフェースをブラウザから直接呼び出すことができました。結果は良かったし、ミスも誤りもなかった。
そして、私たちはパフォーマンステストツールjmeterに切り替えました。このツールは、ユーザーからインターフェースを呼び出すという大きなプレッシャーをシミュレートすることができました。私たちは1秒間にインターフェイスを呼び出すための1500リクエストを作成しました。結果は以下の通りです。しかし:まず
、コードは[OK]を働いたと私たちは、商品ストレージがしばらくして10
に限定されていた、我々はそのカウント数を見ることができることがわかります制限を破った、それgrowssss!
redis incrが偉大なユーザーの要求に基づいてストレージに制限を加えることができない理由がわかりません。誰でも私にそれにライトをつけることができますか?
redis incrのメカニズムに基づいて、incrコマンドを実行した後に新しい値を返します。もしそうなら、数字の増加を止めることができないのは本当に奇妙なことです。
私は、おそらく同時に、incr操作を行うためにredisに送信する2つの操作がありますが、incrコマンドを実行して直接戻ってきます。もう1つは非常に遅くincrを返します。他の要求がすでにincrコマンドを実行していて、良い記憶容量が10に増えているため、増加する数は2ではなく11です。しかし、この説明は正しくはありません。なぜなら、redisは単一スレッドモデルであるからです。
-------- EDIT ----------------
私はスレッドセーフな問題を避けるために、自分のコードを変更:
long result = redisUtil.incrRedisEx("axgggggggggg");
if (result <= 10) {
logger.error("==generate==order==result==" + result);
}
Struts2Utils.renderJson(result);
return;
ログが10回以上書き込まれることがわかりました。
performanceToken'は、複数のスレッド環境で実行 'していますか? –
@for_stackこれはstrutsのアクションです。私はそれをユーザーに公開します。 – CharlieShi
'performanceToken'はスレッドセーフではありません。ユーザーまたはテストコードがこのメソッドを複数のスレッドで呼び出すと、 'count'は10より大きい場合があります。 –