numatrix est un framework qui génère des nombres 64 bits uniques dans un environnement distribué qui fonctionne en parallèle.
Le fait d'avoir un ID unique pour chaque JVM distribuée permet à chacun de générer un numéro unique à tous les niveaux. Parce que chacun est indépendant, il fonctionne très vite. Il est thread-safe et fonctionne en parallèle pour chaque thread.
numatrix décompose 64 bits en 3 champs et attribue une valeur à chacun.
Le premier bit représente un signe, donc si vous n'émettez pas de valeur négative, il sera fixé à 0 et ne sera pas utilisé.
Téléchargez le source depuis numatrix et construisez avec maven.
Créez une classe qui hérite de la classe NumatrixNumberGeneratorFactory.
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("Chemin du fichier de propriété"));
} 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;
}
}
Un numéro unique peut être généré pour chaque valeur de retour de cette méthode. Lorsque vous utilisez plusieurs numéros uniques, créez plusieurs classes qui implémentent cette méthode et utilisez-les correctement.
Veuillez renvoyer une valeur unique pour chaque JVM qui utilise cette classe d'implémentation dans un environnement dans lequel vous souhaitez que les nombres soient uniques. Veuillez utiliser les valeurs de retour dans l'ordre de 0.
Veuillez renvoyer le nombre maximal de machines virtuelles Java qui utilisent cette classe d'implémentation dans un environnement où vous souhaitez que les nombres soient uniques.
Veuillez renvoyer le nombre maximal d'instances NumatlixNumberGenerator générées pour chaque JVM. Une instance de NumatrixNumberGenerator est attribuée à chaque thread qui produit un numéro unique.
Obtenez une instance de NumatrixNumberGenerator à partir d'une instance de la classe d'implémentation NumatrixNumberGeneratorFactory et générez un numéro unique.
public class Sample {
public static void main(String[] args) throws NumatrixNumberGenerateException {
NumatrixNumberGeneratorFactoryImple factory = new NumatrixNumberGeneratorFactoryImple();
NumatrixNumberGenerator generator = factory.getGenerator();
long uniqueueNumber = generator.generate();
}
}
L'instance NumatlixNumberGenerator de la valeur de retour de getGenerator () est différente pour chaque thread qui l'a appelée. Si le thread qui a appelé getGenerator () n'est plus référencé et peut être détruit par garbage collection, l'instance NumatlixNumberGenerator de ce thread sera réutilisée par un autre thread.
Vous pouvez générer un numéro unique avec NumatrixNumberGenerator # generate ().
** numatrix ne sera plus disponible après environ 136 ans à compter de 2017. ** ** La solution de contournement sera expliquée dans Personnalisation.
Vous pouvez le personnaliser en créant une classe qui hérite de la classe NumatrixNumberGenerator et en remplaçant chaque méthode. Remplacez la méthode getGenerator () dans la classe d'implémentation de NumatrixNumberGeneratorFactory et implémentez-la pour renvoyer une instance de la classe héritée.
public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {
class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
//Personnaliser le générateur de nombres TODO Numatrix
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
}
@Override
protected NumatrixNumberGenerator makeGenerator(int generatorId, int generatorIdBitLength) {
return new NumatrixNumberGeneratorEx(generatorId, generatorIdBitLength);
}
Si un ** nombre consécutif ** d'un champ de trisection de 64 bits dépasse la valeur maximale, la valeur du champ d'horodatage doit être mise à jour, mais le champ d'horodatage est mis à jour toutes les secondes. Pour, ** Nombre maximum de nombres consécutifs = Nombre maximum de sorties par seconde qui est unique pour chaque thread ** Ce sera. Puisque le nombre de bits de nombres consécutifs est le reste du nombre de bits consommés par les autres champs, ** Vous pouvez augmenter la valeur maximale en réduisant le nombre de bits des autres champs. ** **
Comme le nombre de bits du champ ID unique à l'environnement est déterminé par l'implémentation de getMaxJvmCount () et getMaxGeneratorCount () de NumatlixNumberGeneratorFactory, le nombre de bits peut être réduit en réduisant leurs valeurs de retour.
Les autres champs modifient le nombre de bits comme suit.
En autorisant la sortie de valeurs négatives, le premier bit de 64 bits devient disponible et le nombre de bits dans le champ numérique consécutif peut être augmenté.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public boolean isOutMinus() {
return true;
}
}
Vous pouvez augmenter le nombre de champs de nombres consécutifs en réduisant le nombre de bits dans le champ d'horodatage. La valeur initiale du champ d'horodatage est de 32 bits, ce qui peut représenter le nombre de secondes jusqu'à environ 136 ans, mais chaque fois que le nombre de bits est réduit de un, la valeur maximale de l'horodatage est divisée par deux et la date d'expiration est disponible. Sera plus court.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public int getTimestampBitLength() {
//Réduire de 32 bits
return 31;
}
}
Un ** horodatage ** d'un 64 bits divisé en trois champs ne peut pas dépasser le nombre qui peut être représenté par le nombre de bits dans le champ (32 bits par défaut). Étant donné que l'horodatage correspond au nombre de secondes qui se sont écoulées depuis l'heure de référence (le paramètre par défaut est 00:00 le 3 novembre 2017), vous pouvez prolonger la période disponible en modifiant l'heure de référence. ** **
Modifiez l'heure de référence. Pour l'heure de référence, définissez l'heure avant le début de l'utilisation de numatrix.
public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
super(generatorId, generatorIdBitLength);
}
@Override
public Date getBaseTime() {
try {
//Changement d'heure de référence
return new SimpleDateFormat("yyyyMMdd").parse("20171111");
} catch (ParseException e) {
throw new RuntimeException();
}
}
}
Recommended Posts