spring-data-redis - redis并发计数
phpcn_u1582
phpcn_u1582 2017-04-25 09:03:18
0
2
1139

说明:
用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_u1582
phpcn_u1582

全員に返信(2)
世界只因有你

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

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

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

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

いいねを押す +0
左手右手慢动作

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

例を示します:

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

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

リーリー

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

リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート