Heim > Datenbank > Redis > So implementieren Sie den globalen Redis-ID-Generator

So implementieren Sie den globalen Redis-ID-Generator

PHPz
Freigeben: 2023-05-27 12:02:49
nach vorne
1495 Leute haben es durchsucht

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:

  • Vorzeichenbit: 1 Bit, immer 0, was eine positive Zahl anzeigt

  • Zeitstempel: 31 Bit, in Sekunden , kann ca. 69 Jahre lang verwendet werden

Seriennummer: 32 Bit Bei gleicher Anzahl an Sekunden erhöht sich die ID an der Seriennummernposition, wodurch die Generierung von 2^32 verschiedenen IDs pro Sekunde unterstützt wird

Code-Implementierung:

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);
    }
}
Nach dem Login kopieren

Generieren einer Seriennummer:

So implementieren Sie den globalen Redis-ID-GeneratorRedis 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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage