Der globale ID-Generator ist ein Tool zum Generieren global eindeutiger IDs in verteilten Systemen. Er erfüllt im Allgemeinen die folgenden Eigenschaften:
Einzigartigkeit: Stellen Sie sicher, dass die ID eindeutig und nicht wiederholbar ist.
Inkrementalität: Stellen Sie sicher, dass dies der Fall ist nimmt insgesamt allmählich zu, was der Erstellung von Datenbankindizes förderlich ist Die Generierung einer ID ist schnell genug. Inkrementwert mit anderen Informationen. Die spezifische Zusammensetzung der ID ist wie in der Abbildung dargestellt:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @Component public class RedisIdWorker { /** * 开始时间戳 (2022-01-01 00:00:00) */ private static final long BEGIN_TIMESTAMP = 1640995200L; /** * 序列号的位数 */ private static final int COUNT_BITS = 32; @Autowired private StringRedisTemplate stringRedisTemplate; /** * 生成ID * * @param keyPrefix 业务系统的前缀 * @return ID */ public long nextId(String keyPrefix) { // 生成时间戳 long timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) - BEGIN_TIMESTAMP; // 生成序列号 String key = "icr:" + keyPrefix + ":" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy:MM:dd")); long count = stringRedisTemplate.opsForValue().increment(key); // 拼接并返回 return timestamp << COUNT_BITS | count; } /** * 获取时间戳 (2022-01-01 00:00:00) * @param args */ public static void main(String[] args) { LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0); long second = time.toEpochSecond(ZoneOffset.UTC); System.out.println(second); } }
Redis Es gibt eine Obergrenze für die Selbstinkrementierung und der Maximalwert beträgt 2^64. Obwohl diese Zahl groß ist, gibt es doch eine Obergrenze, und wenn die Zeit lange genug andauert, ist es immer noch möglich, diese Zahl zu überschreiten. Selbst wenn es sich um dasselbe Unternehmen handelt, kann daher nicht derselbe Schlüssel verwendet werden. Daher können Sie dem Schlüssel ein Datum hinzufügen, z. B.: icr: Firmenname: 2022:05:14. Der auf diese Weise generierte Schlüssel ist jeden Tag ein neuer Schlüssel, und die tägliche Erhöhung wird 2 ^ 64 nicht überschreiten, sodass ein solcher Schlüssel die geeignetere Wahl ist.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den globalen Redis-ID-Generator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!