numatrix ist ein Framework, das in einer parallel ausgeführten verteilten Umgebung eindeutige 64-Bit-Zahlen generiert.
Mit einer eindeutigen ID für jede verteilte JVM kann jede eine eindeutige Nummer auf der ganzen Linie generieren. Da jeder unabhängig ist, läuft er sehr schnell. Es ist threadsicher und läuft für jeden Thread parallel.
numatrix zerlegt 64 Bit in 3 Felder und weist jedem einen Wert zu.
Das erste Bit stellt ein Vorzeichen dar. Wenn Sie also keinen negativen Wert ausgeben, wird es auf 0 festgelegt und nicht verwendet.
Laden Sie die Quelle von numatrix herunter und erstellen Sie mit maven.
Erstellen Sie eine Klasse, die von der NumatrixNumberGeneratorFactory-Klasse erbt.
package numatrix;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {
@Override
protected int getTypeId() {
return 0;
}
@Override
protected int getJvmId() {
Properties properties = new Properties();
try {
properties.load(new FileInputStream("Pfad der Eigenschaftendatei"));
} catch (IOException e) {
throw new RuntimeException(e);
}
return Integer.parseInt(properties.getProperty("jvmid"));
}
@Override
protected int getMaxJvmCount() {
return 100;
}
@Override
protected int getMaxGeneratorCount() {
return 300;
}
}
Für jeden Rückgabewert dieser Methode kann eine eindeutige Nummer generiert werden. Wenn Sie mehrere eindeutige Nummern verwenden, erstellen Sie mehrere Klassen, die diese Methode implementieren, und verwenden Sie sie ordnungsgemäß.
Bitte geben Sie einen eindeutigen Wert für jede JVM zurück, die diese Implementierungsklasse in einer Umgebung verwendet, in der die Zahlen eindeutig sein sollen. Bitte verwenden Sie die Rückgabewerte in der Reihenfolge von 0.
Bitte geben Sie die maximale Anzahl von JVMs zurück, die diese Implementierungsklasse in einer Umgebung verwenden, in der die Nummern eindeutig sein sollen.
Bitte geben Sie die maximale Anzahl von NumatlixNumberGenerator-Instanzen zurück, die für jede JVM generiert wurden. Jedem Thread, der eine eindeutige Nummer erzeugt, wird eine NumatrixNumberGenerator-Instanz zugewiesen.
Rufen Sie eine NumatrixNumberGenerator-Instanz von einer Instanz der NumatrixNumberGeneratorFactory-Implementierungsklasse ab und generieren Sie eine eindeutige Nummer.
public class Sample {
public static void main(String[] args) throws NumatrixNumberGenerateException {
NumatrixNumberGeneratorFactoryImple factory = new NumatrixNumberGeneratorFactoryImple();
NumatrixNumberGenerator generator = factory.getGenerator();
long uniqueueNumber = generator.generate();
}
}
Die NumatlixNumberGenerator-Instanz des Rückgabewerts von getGenerator () ist für jeden Thread, der sie aufgerufen hat, unterschiedlich. Wenn der Thread, der getGenerator () aufgerufen hat, nicht mehr referenziert wird und durch Garbage Collection zerstört werden kann, wird die NumatlixNumberGenerator-Instanz dieses Threads von einem anderen Thread wiederverwendet.
Sie können mit NumatrixNumberGenerator # generate () eine eindeutige Nummer generieren.
** numatrix wird nach ca. 136 Jahren ab 2017 nicht mehr verfügbar sein. ** ** ** Die Problemumgehung wird unter Anpassung erläutert.
Sie können es anpassen, indem Sie eine Klasse erstellen, die von der NumatrixNumberGenerator-Klasse erbt, und jede Methode überschreiben. Überschreiben Sie die Methode getGenerator () in der Implementierungsklasse NumatrixNumberGeneratorFactory und implementieren Sie sie, um eine Instanz der geerbten Klasse zurückzugeben.
public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {
class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
//Passen Sie den TODO Numatrix Number Generator an
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
}
@Override
protected NumatrixNumberGenerator makeGenerator(int generatorId, int generatorIdBitLength) {
return new NumatrixNumberGeneratorEx(generatorId, generatorIdBitLength);
}
Wenn eine ** fortlaufende Zahl ** eines 64-Bit-Trisektionsfelds den Maximalwert überschreitet, muss der Wert des Zeitstempelfelds aktualisiert werden, das Zeitstempelfeld wird jedoch jede Sekunde aktualisiert. Zum, ** Maximale Anzahl aufeinanderfolgender Nummern = Maximale Anzahl von Ausgaben pro Sekunde, die für jeden Thread eindeutig ist ** Es wird sein. Da die Anzahl der Bits aufeinanderfolgender Nummern der Rest der Anzahl der von anderen Feldern verbrauchten Bits ist, ** können Sie den Maximalwert erhöhen, indem Sie die Anzahl der Bits anderer Felder verringern. ** ** **
Die Anzahl der Bits des ID-Felds, die für die Umgebung eindeutig sind, wird durch die Implementierung von getMaxJvmCount () und getMaxGeneratorCount () von NumatlixNumberGeneratorFactory bestimmt, sodass die Anzahl der Bits durch Reduzieren ihrer Rückgabewerte verringert werden kann.
Die anderen Felder ändern die Anzahl der Bits wie folgt.
Durch Zulassen der Ausgabe negativer Werte wird das erste 1 Bit von 64 Bit verfügbar, und die Anzahl der Bits im Feld für fortlaufende Nummern kann erhöht werden.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public boolean isOutMinus() {
return true;
}
}
Sie können die Anzahl der aufeinanderfolgenden Nummernfelder erhöhen, indem Sie die Anzahl der Bits im Zeitstempelfeld verringern. Der Anfangswert des Zeitstempelfelds beträgt 32 Bit, was die Anzahl der Sekunden bis zu etwa 136 Jahren darstellen kann. Jedes Mal, wenn die Anzahl der Bits um eins verringert wird, wird der Maximalwert des Zeitstempels halbiert und das Ablaufdatum ist verfügbar. Wird kürzer sein.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public int getTimestampBitLength() {
//Von 32 Bit reduzieren
return 31;
}
}
Ein ** Zeitstempel ** eines 64-Bit-Bereichs, der in drei Felder unterteilt ist, darf die Anzahl nicht überschreiten, die durch die Anzahl der Bits im Feld dargestellt werden kann (standardmäßig 32 Bit). Da der Zeitstempel die Anzahl der Sekunden ist, die seit der Referenzzeit vergangen sind (Standardeinstellung ist 00:00 am 3. November 2017), können Sie den verfügbaren Zeitraum verlängern, indem Sie die Referenzzeit ändern. ** ** **
Ändern Sie die Referenzzeit. Definieren Sie für die Referenzzeit die Zeit vor dem Beginn der Verwendung von numatrix.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public Date getBaseTime() {
try {
//Änderung der Referenzzeit
return new SimpleDateFormat("yyyyMMdd").parse("20171111");
} catch (ParseException e) {
throw new RuntimeException();
}
}
}
Recommended Posts