1. Konzept: Die Auswirkungen mehrerer Hinrichtungen sind die gleichen wie die Auswirkungen einer einzigen Hinrichtung.
Nach dieser Bedeutung besteht die ultimative Bedeutung darin, dass die Auswirkung auf die Datenbank nur einmalig sein kann und nicht wiederholt verarbeitet werden kann. Um die Idempotenz sicherzustellen, werden normalerweise die folgenden Methoden verwendet:
1: Die Datenbank erstellt einen eindeutigen Index, der sicherstellen kann, dass letztendlich nur ein Datenelement in die Datenbank eingefügt wird
# 🎜🎜#2: Token-Mechanismus: Rufen Sie vor jeder Schnittstellenanforderung ein Token ab und fügen Sie dieses Token beim nächsten Mal zum Header der Anforderung hinzu. Wenn die Überprüfung erfolgreich ist, wird das Token gelöscht#🎜 🎜#3: Pessimistische Sperre oder optimistische Sperre können sicherstellen, dass andere SQL-Dateien nicht jedes Mal aktualisiert werden können (wenn die Datenbank-Engine innodb ist, die Auswahlbedingung). muss ein eindeutiger Index sein, um das Sperren der gesamten Tabelle zu verhindern.)#🎜🎜 #
4: Zuerst die Datenbank abfragen, um zu sehen, ob die Daten vorhanden sind wurde gestellt und die Anfrage wird direkt abgelehnt. Wenn sie nicht existiert, beweist dies, dass sie zum ersten Mal eingeht, und sie wird direkt freigegeben. redis Schematische Darstellung zur Realisierung der automatischen Idempotenz:1. Redis-Service-API erstellen#🎜 🎜# 1: Richten Sie zunächst den Redis-Server ein.
/* 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; } }
2. AutoIdempotent anpassen
Der Hauptzweck der Definition dieser Annotation besteht darin, sie hinzuzufügen, wenn Sie Idempotenz erreichen müssen. Wenn eine Methode eine Methode mit Anmerkungen versehen wird, ist sie automatisch idempotent. Wenn diese Annotation mithilfe von Reflektion im Hintergrund gescannt wird, wird die Methode verarbeitet, um eine automatische Idempotenz zu erreichen. Die Metaannotation ElementType.METHOD wird verwendet, um anzugeben, dass sie nur auf der Methode platziert werden kann, und etentionPolicy.RUNTIME gibt an, dass dies der Fall ist Wird während der Laufzeit verwendet
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 { }
Wir erstellen eine neue Schnittstelle, um einen Token-Service zu erstellen. Es gibt hauptsächlich zwei Methoden: Eine wird zum Erstellen eines Tokens und eine zum Überprüfen des Tokens verwendet. Beim Erstellen eines Tokens wird hauptsächlich eine Zeichenfolge generiert, die hauptsächlich das Anforderungsobjekt übermittelt. Die Hauptfunktion besteht darin, das Token im Header abzurufen, es dann zu überprüfen und die spezifischen Fehlerinformationen über die ausgelöste Ausnahme abzurufen und an das Frontend zurückzugeben
public interface TokenService { /** * 创建token * @return */ String createToken(); /** * 检验token的合法性 * @param request * @return * @throws Exception */ boolean checkToken(HttpServletRequest request) throws Exception; }
Das obige ist der detaillierte Inhalt vonWie Springboot automatische idempotente Schnittstellen implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!