1. 概念: 複数の実行の影響は、1 回の実行の影響と同じです。
この意味によると、最終的な意味は、データベースへの影響は 1 回だけであり、繰り返し処理することはできないということです。冪等性を確認する方法。通常は次の方法が使用されます。
1: データベースは一意のインデックスを確立します。これにより、最終的に 1 つのデータのみがデータベースに挿入されることが保証されます。
2 : トークンの仕組み、各インターフェースリクエスト まずトークンを取得し、次回リクエストのヘッダーボディにこのトークンを追加してバックグラウンドで検証し、検証が通ればトークンを削除し、再度トークンを判定する次のリクエスト
3: 悲観的ロックまたは楽観的ロック、悲観的ロックを使用すると、他の SQL が更新のたびにデータを更新できないようにできます (データベース エンジンが innodb の場合、選択条件は、テーブル全体がロックされるのを防ぎます)
4: まず、クエリ後の判断として、まずデータベースにデータが存在するかどうかを確認し、存在する場合はリクエストが行われたことを証明し、リクエストは直接拒否されます。存在しない場合は初入荷であることを証明し、そのまま公開します。
Redis は自動べき等性の概略図を実現します:
1: まず、Redis を構築しますサーバー。
2: springboot に redis ステーター、または Spring によってカプセル化された jedis を導入します。後で使用するメイン API は、その set メソッドと存在メソッドです。ここでは、springboot のカプセル化された redisTemplate を使用します
コードは次のとおりです:
/* redis工具类 */ @Component public class RedisService { @Autowired private RedisTemplate redisTemplate; /** * 写入缓存 * @param key * @param value * @return */ public boolean set(final String key,Object value){ boolean result = false; try { ValueOperations<Serializable,Object> operations = redisTemplate.opsForValue(); operations.set(key,value); result = true; }catch (Exception e){ result = false; e.printStackTrace(); } return result; } /** * 写入缓存有效期 * @return */ public boolean setEx(final String key ,Object value,Long expireTime){ boolean result = false; try { ValueOperations<Serializable,Object> operations = redisTemplate.opsForValue(); operations.set(key,value); redisTemplate.expire(key,expireTime, TimeUnit.SECONDS);//有效期 result = true; }catch (Exception e){ result = false; e.printStackTrace(); } return result; } /** * 判断缓存中是否有对应的value * @param key * @return */ public boolean exists(final String key){ return redisTemplate.hasKey(key); } /** * 读取缓存 * @param key * @return */ public Object get(final String key){ Object obj = null; ValueOperations<Serializable,Object> operations= redisTemplate.opsForValue(); obj = operations.get(key); return obj; } /** * 删除对应的value * @param key * @return */ public boolean remvoe(final String key){ if(exists(key)){ Boolean delete = redisTemplate.delete(key); return delete; } return false; } }
アノテーションをカスタマイズします。このアノテーションを定義する主な目的は、冪等である必要があるメソッドにアノテーションを追加することです。メソッドにアノテーションが付けられている場合は常に、自動的にべき等になります。このアノテーションがバックグラウンドでリフレクションを使用してスキャンされる場合、メソッドは自動冪等性を達成するために処理されます。メタアノテーション ElementType.METHOD は、メソッドにのみ配置できることを示すために使用され、etentionPolicy.RUNTIME は、それがメソッドにのみ配置できることを示します。実行時に使用されます。
package com.yxkj.springboot_redis_interceptor.annotion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AutoIdempotent { }
トークン サービスを作成するための新しいインターフェイスを作成します。方法は主に 2 つあります。 1 つはトークンの作成用、もう 1 つはトークンの検証用です。トークンの作成では主に文字列の生成が行われますが、トークンのチェックでは主にリクエストオブジェクトを伝えることになりますが、なぜリクエストオブジェクトを渡す必要があるのでしょうか?主な機能は、ヘッダー内のトークンを取得して確認し、スローされた例外を通じて特定のエラー情報を取得し、それをフロントエンド
public interface TokenService { /** * 创建token * @return */ String createToken(); /** * 检验token的合法性 * @param request * @return * @throws Exception */ boolean checkToken(HttpServletRequest request) throws Exception; }
トークンは redis サービスを参照し、トークンを作成し、ランダム アルゴリズム ツール クラスを使用してランダムな uuid 文字列を生成し、それを redis に配置します (データの冗長な保持を防ぐため、ここでは有効期限を 10000 秒に設定します。ビジネス)、プットが成功した場合は、最後にこのトークン値を返します。 checkTokenメソッドはヘッダーから値にトークンを取得するもので(ヘッダーから取得できない場合はパラメータから取得します)、存在しない場合は直接例外をスローします。この例外情報はインターセプターによってキャッチされ、フロントエンドに返されます。
以上がspringboot が自動冪等インターフェイスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。