Para realizar el algoritmo de generación de la ID del sistema distribuido, se puede usar el algoritmo Snowflake

El algoritmo Snowflake es el algoritmo de generación de ID distribuida de código abierto de Twitter, que puede generar una ID única de 64 bits, que incluye una marca de tiempo, una ID de máquina y un número de serie. El siguiente es el código para implementar el algoritmo Snowflake en el lenguaje Java:

public class SnowflakeIdWorker {     public static void main(String[] args) {         SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1L);         // 生成10个ID          for (int i = 0; i < 10; i++) {              long id = idWorker.nextId();             Sistema.salida.println(id);         }      }
    








    

    // Número de dígitos ocupados por la marca de tiempo
        
    private static final long TIMESTAMP_BITS = 41L;
    
    // Número de dígitos ocupados por el ID de la máquina
    
    private static final long WORKER_ID_BITS = 10L;
    
    // Número de dígitos ocupados por el número de serie
    private static final long SEQUENCE_BITS = 12L;
    
    // El ID de máquina más grande, 1023
    private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
    
    // el número de serie más grande, 4095
    private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);
    
    // a la izquierda de el número de turno de marca de tiempo, 22
    private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
    
    // número de turno a la izquierda de ID de máquina, 12
    private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
    
    // marca de tiempo de la última ID generada
    private long lastTimestamp = -1L;
    
    // número de serie
    secuencia larga privada = 0L;
    
    // ID de máquina
    private final long workerId;
    
    // constructor
    public SnowflakeIdWorker(long workerId) {     if (workerId < 0 || workerId > MAX_WORKER_ID) {     throw new IllegalArgumentException(String.format("workerId can' t ser mayor que %d o menor que 0", MAX_WORKER_ID));     }     this.workerId = workerId;     }     // Método para generar ID     público sincronizado long nextId() {     long timestamp = System.currentTimeMillis();     // Si el actual Si el tiempo es menor que la marca de tiempo de la última ID generada, significa que el reloj del sistema se ha retrocedido y debe esperar a que la hora alcance la última marca de tiempo     if (timestamp < lastTimestamp) {     try {     wait(lastTimestamp - marca de tiempo);





    



    




    } catch (InterruptedException e) {     throw new RuntimeException(e);     }     timestamp = System.currentTimeMillis();     if (timestamp < lastTimestamp) {     throw new RuntimeException(String.format("El reloj se movió hacia atrás. Negarse a generar id para %d milisegundos", lastTimestamp - timestamp)); } }     //     Si     se generan al mismo tiempo, debe usar números de secuencia para distinguir diferentes ID     if (lastTimestamp == timestamp) {     secuencia = (secuencia + 1) & MAX_SEQUENCE;     if ( secuencia == 0) {     marca de tiempo = tilNextMillis (última marca de tiempo);     }     } else {     secuencia = 0L;     }     última marca de tiempo = marca de tiempo;







    









    

    
    // El formato de ID es: timestamp-machine ID-serial number
    return ((timestamp << TIMESTAMP_SHIFT) | (workerId << WORKER_ID_SHIFT) | secuencia);
    }
    
    // tiempo de espera para ponerse al día con la última marca de tiempo
    private long tilNextMillis(long lastTimestamp) {     marca de tiempo larga = System.currentTimeMillis();     while (marca de tiempo <= lastTimestamp) {     marca de tiempo = System.currentTimeMillis();     }     return marca de tiempo;     }






}


En el código anterior, se generan 10 ID distribuidos mediante la clase SnowflakeIdWorker. Especifique la ID de la máquina en el constructor y llame al método nextId para generar una ID única. Esta ID consta de tres partes: marca de tiempo, ID de máquina y número de serie. Entre ellos, la marca de tiempo ocupa 41 bits y puede admitir marcas de tiempo de 69 años; la ID de máquina ocupa 10 bits y puede admitir 1024 máquinas; el número de serie ocupa 12 bits y puede generar 4096 ID en el mismo milisegundo. El ID generado es un dato de tipo largo de 64 bits, que puede identificar de forma única un objeto en un sistema distribuido.
 

おすすめ

転載: blog.csdn.net/yijiemuhuashi/article/details/129766829