検索

ホームページ  >  に質問  >  本文

spring-data-redis - redis并发计数

说明:
用redis计数器存取用户的操作次数,最多3次,但是并发会超过3次,下面的代码对吗?

BoundValueOperations<String, String> operations = redisTemplate.boundValueOps("key1");
        String key1 = operations.get();
        if (StringUtils.isEmpty(key1)) {
            service.do();//这里是业务逻辑操作成功之后,计数器加1
            operations.increment(1);
        } else {
            if (Integer.parseInt(key1) < 2) {
                service.do();//这里是业务逻辑操作成功之后,计数器加1
                operations.increment(1);
            }
        }
phpcn_u1582phpcn_u15822860日前1160

全員に返信(2)返信します

  • 世界只因有你

    世界只因有你2017-04-25 09:05:18

    この種の数を数えるビジネスでは、最初に数を数えてからビジネスを行う必要があります。用事が完了しカウンターが制限値を超えている場合は気絶してしまいます。

    私の計画は次のとおりです:
    同時実行によってデータの不整合が発生するため、Redis の INCR コマンドを使用して 1 ずつ増分し、最新の値を取得することを検討できます (これは 1 回限りの操作であるため、不整合は発生しません):

    • 3 より大きい場合は、超過して終了したことを意味します

    • ;
    • が 3 以下の場合は、ビジネスを実行します (ビジネス実行の失敗に対するロールバック カウンタも考慮できます)。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-25 09:05:18

    Java クライアントを介して上記の関数を実装すると、データに一貫性がなくなる可能性があるため、スクリプトのアトミック性を確保するために lua スクリプトを使用することをお勧めします。 SCRIPT LOAD を通じてキャッシュされ、ネットワーク送信を削減するために sha1 チェック値 + パラメータ (キー、ARG) を通じて実行されます。

    例を示します:

    1. 機能要件: キーが存在しない場合は、キーを設定して false を返し、タイムアウトに達するか指定されたカウントに達すると、false を返してリセットします。タイムアウトとカウント = 1; タイムアウトに達せず、指定されたカウントに達しない場合は、true を返し、カウントを増加します

    redis.lua スクリプトは次のとおりです:

    リーリー

    Javaコードは次のとおりです:

    リーリー

    返事
    0
  • キャンセル返事