说明:
用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);
}
}
この種の数を数えるビジネスでは、最初に数を数えてからビジネスを行う必要があります。用事が完了しカウンターが制限値を超えている場合は気絶してしまいます。
私の計画は次のとおりです:
同時実行によってデータの不整合が発生するため、Redis の
INCR
コマンドを使用して 1 ずつ増分し、最新の値を取得することを検討できます (これは 1 回限りの操作であるため、不整合は発生しません):3 より大きい場合は、超過して終了したことを意味します
が 3 以下の場合は、ビジネスを実行します (ビジネス実行の失敗に対するロールバック カウンタも考慮できます)。
Java クライアントを介して上記の関数を実装すると、データに一貫性がなくなる可能性があるため、スクリプトのアトミック性を確保するために lua スクリプトを使用することをお勧めします。 SCRIPT LOAD を通じてキャッシュされ、ネットワーク送信を削減するために sha1 チェック値 + パラメータ (キー、ARG) を通じて実行されます。
例を示します:1. 機能要件: キーが存在しない場合は、キーを設定して false を返し、タイムアウトに達するか指定されたカウントに達すると、false を返してリセットします。タイムアウトとカウント = 1; タイムアウトに達せず、指定されたカウントに達しない場合は、true を返し、カウントを増加します
redis.lua スクリプトは次のとおりです:リーリー
Javaコードは次のとおりです:リーリー